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;
    }