我在項目中使用JPA 2.0和休眠並面臨問題: em.merge()不生成更新語句。em.merge不生成更新語句
詳細情況是: 我有一個實體,它已成功保存。它在其他實體上有一個外鍵,映射如下:
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ENTITY2_ID", referencedColumnName = "ID")
@ForeignKey(name = "FK_ENTITY2_PS")
private Entity2 entity2;
它被創建了一會兒,並且也持續存在。之後,我製作
entity1.setEntity2(entity2);
em.merge(entity1);
並查看日誌:hibernate不會爲此生成更新語句,並且我的應用程序會因違反約束而崩潰。這是一個錯誤?或者我做錯了什麼?
UPD 日誌記錄打開,我看到插入那裏。 em.merge()
發生的方法在@Stateless
bean的內部,默認情況下,這些方法的默認值爲TransactionalAttribute.REQUIRED
。
你可能做錯了什麼。該問題可能是由於ConstraintViolationException。 – 2011-05-20 13:48:04
從哪裏調用包含em.merge()的方法?註釋TransactionalAttribute.REQUIRED不會創建新的事務,因此除非您已經在事務中(例如,調用方法註釋爲@Transactional),否則這將不起作用。嘗試使用@Transactional來排列方法,或者使用TransactionalAttribute。REQUIRES_NEW - 雖然你應該認爲通過它意味着它總是會創建一個新的事務 – rhinds 2011-05-20 14:44:30
另外,雖然它不會導致這個問題,但我通常避免使用merge(),除非處理分離的實體 - 如果加載任何對象在事務內部,一旦事務完成,在同一事務中對該對象所做的任何更改都將自動保留,請參閱已更新的問題 – rhinds 2011-05-20 17:11:40