我有以下实体:

@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()。尽管仍然需要。

07-24 21:06