我有以下实体
@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
来执行数据库事务。
答案 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();
以明确地将其从数据库中删除。