保存具有多对一关系的实体

时间:2015-10-12 10:03:49

标签: java hibernate jpa

我有以下实体

@Entity
public class Session{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;
    @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, orphanRemoval=true)
    @JoinColumn(name="session_id", referencedColumnName="id")
    private List<SessionChart> sessionCharts;

    public List<SessionChart> getSessionCharts() {
        return sessionCharts;
    }

    public void setSessionCharts(List<SessionChart> sessionCharts) {
        this.sessionCharts = sessionCharts;
    }
}

和实体

@Entity
@Table(name="session_chart")
public class SessionChart implements  {



    @Transient
    private boolean isActive = false;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String chartName;
}

假设我从特定会话中检索了我的会话图

List<SessionChart> mySessionCharts = new ArrayList<SessionChart>();
mySessionCharts = session.getSessionCharts();

在我的代码中,我更改了一个sessionChart的名称。如果我保存会话(合并)实体,则sessionCharts ArrayList将被更新。我的问题如下:

我可以只保存列表中的SessionChart对象而不保存会话吗?如果我删除会话图表并将其从ArrayList中删除它会起作用吗?

我正在使用jpa hibernate和EntityManager以及EntityManagerFactory来执行数据库事务。

1 个答案:

答案 0 :(得分:0)

  

我可以只保存列表中的SessionChart对象而不保存会话吗?

是的,只要实体仍然受到管理且您的交易仍然有效,这是可能的。所以这段代码将起作用:

db.session_log.aggregate({
  "$project": {
    "ISODate": {
      "$add": [new Date(0), {
        "$multiply": [1000, "$LASTLOGIN"]
      }]
    }
  }
}, {
  "$project": {
    "yearMonthDay": {
      "$dateToString": {
        "format": "%Y-%m-%d",
        "date": "$ISODate"
      }
    }
  }
}, {
  "$group": {
    "_id": "$yearMonthDay",
    "count": {
      "$sum": 1
    }
  }
})
  

如果我删除会话图并将其从ArrayList中删除它会起作用吗?

我不确定我是否理解你的问题,但事情就是这样:如果你只从集合对象中删除EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Session session = em.find(Session.class, 1); List<SessionChart> mySessionCharts = session.getSessionCharts(); for (SessionChart sessionChart : mySessionCharts) { sessionChart.setChartName("test"); // this will update each session chart name in the DB } em.getTransaction().commit(); em.close(); 对象,然后调用SessionChart,这将取消链接来自其父em.merge(session)的{​​{1}}对象。示例如下:

SessionChart

这将导致session_chart表上的SQL更新:

Session

您仍然需要调用EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Session session = em.find(Session.class, 1); List<SessionChart> sessionChartList = session.getSessionCharts(); sessionChartList.remove(0); // remove the first object from the list em.merge(session); em.getTransaction().commit(); 以明确地将其从数据库中删除。