Java JPA替换实体的1:M集
我拥有以下实体:Java JPA替换实体的1:M集,java,jpa,one-to-many,Java,Jpa,One To Many,我拥有以下实体: @Entity public class Alert implements Serializable { private long alertId; private Set<AlertTime> alertTimes = new HashSet<AlertTime>(0); @OneToMany(cascade = CascadeType.ALL) public Set<AlertTime> getAlert
@Entity
public class Alert implements Serializable {
private long alertId;
private Set<AlertTime> alertTimes = new HashSet<AlertTime>(0);
@OneToMany(cascade = CascadeType.ALL)
public Set<AlertTime> getAlertTimes() {
return alertTimes;
}
}
当我需要更新Alert
时,可能会有不同数量的AlertTime
s,因此我尝试合并Alert
并删除AlertTime
s并保留新的。问题在于(AlertTime.alertTimeId,AlertTime.time)上有一个唯一的索引,当我尝试删除并在同一事务中持久化时,SQL插入发生在删除之前,这违反了约束。我可以在一个单独的事务中删除AlertTime
s实体,但我希望所有实体都在一个事务中,以便在调用后端web服务时发生异常时可以回滚所有更改
是否有更好的方法可以更改
警报
实体的警报时间
?或者,是否至少可以在插入之前强制SQL删除?您可以在删除AlertTime
s后使用em.flush()
刷新上下文,以确保发出delete
语句
另外,最好为
alertTimes
配置孤立删除,通过从集合中删除alertTimes
来从数据库中删除它们,而无需显式调用remove()
。在JPA2.0中使用@OneToMany(…,orphaneremovation=true)
。尽管它仍然需要flush()
,但您可以在删除AlertTime
s后使用em.flush()
刷新上下文,以确保发出delete
语句
另外,最好为
alertTimes
配置孤立删除,通过从集合中删除alertTimes
来从数据库中删除它们,而无需显式调用remove()
。在JPA2.0中使用@OneToMany(…,orphaneremovation=true)
。尽管它仍然需要flush()
不刷新提交到数据库,所以我无法回滚在调用flush()之前所做的更改?我已经用你的解决方案使它工作了,谢谢。@ravun:不,flush不处理任何事务。flush不提交到数据库,所以我无法回滚在调用flush()之前所做的更改?我已经用你的解决方案让它工作了,谢谢。@ravun:不,flush不处理事务。
@Entity
public class AlertTime implements Serializable {
private long alertTimeId;
private Date time;
private Alert alert;
@ManyToOne
public Alert getAlert() {
return this.alert;
}