我有以下实体:
@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;
}
}
和
@Entity
public class AlertTime implements Serializable {
private long alertTimeId;
private Date time;
private Alert alert;
@ManyToOne
public Alert getAlert() {
return this.alert;
}
当我需要更新
Alert
时,可能会有不同数量的AlertTime
,因此我尝试合并Alert
并删除AlertTime
并保留新的。问题是,在(AlertTime.alertTimeId,AlertTime.time)上有一个唯一索引,当我尝试删除然后在同一事务中持久存在时,SQL插入发生在删除之前,这违反了约束。我可以在单独的事务中删除AlertTime
实体,但是我希望所有这些都在一个事务中,因此,如果在调用后端Web服务时发生异常,则可以回滚所有更改。是否有更好的方法可以更改
Alert
实体的alertTimes
?或者,是否可以至少在插入之前强制删除SQL? 最佳答案
在删除em.flush()
之后,可以使用AlertTime
刷新上下文,以确保发出了delete
语句。
另外,最好为alertTimes
配置孤立删除,通过从集合中删除AlertTime
来删除数据库中的remove()
,而无需显式的@OneToMany(..., orphanRemoval = true)
调用。在JPA 2.0中,使用flush()
。尽管仍然需要。