2011-02-16 109 views
0

我有以下實體:JPA代替1:M集的實體

@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 S,所以我試圖合併Alert並刪除AlertTime並堅持新的。問題在於(AlertTime.alertTimeId,AlertTime.time)有一個唯一的索引,當我嘗試刪除然後在同一個事務中持久化時,SQL插入在刪除之前發生,這違反了約束。我可以在單獨的事務中刪除AlertTime的實體,但我希望這一切都在一個事務中,以便在調用後端Web服務時發生異常時可以回滾所有更改。

有沒有更好的方法能夠更改Alert實體的alertTimes?或者,是否有可能在插入之前至少強制SQL刪除?

回答

3

刪除AlertTimes後,您可以使用em.flush()刷新上下文,以確保發佈delete語句。

此外,它可以更好地配置孤兒取消對alertTimes,從集合刪除它們從數據庫中刪除AlertTime S,沒有明確的remove()電話。在JPA 2.0中使用@OneToMany(..., orphanRemoval = true)。雖然它仍然需要flush()

+0

不刷新提交到數據庫,所以我不能回滾調用flush()之前所做的更改?我已經使用您的解決方案工作,謝謝。 – ravun 2011-02-16 13:07:39