2011-05-20 34 views
0

我在項目中使用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

+0

你可能做錯了什麼。該問題可能是由於ConstraintViolationException。 – 2011-05-20 13:48:04

+0

從哪裏調用包含em.merge()的方法?註釋TransactionalAttribute.REQUIRED不會創建新的事務,因此除非您已經在事務中(例如,調用方法註釋爲@Transactional),否則這將不起作用。嘗試使用@Transactional來排列方法,或者使用TransactionalAttribute。REQUIRES_NEW - 雖然你應該認爲通過它意味着它總是會創建一個新的事務 – rhinds 2011-05-20 14:44:30

+0

另外,雖然它不會導致這個問題,但我通常避免使用merge(),除非處理分離的實體 - 如果加載任何對象在事務內部,一旦事務完成,在同一事務中對該對象所做的任何更改都將自動保留,請參閱已更新的問題 – rhinds 2011-05-20 17:11:40

回答

1

有幾件事情可能會出錯,但是您需要檢查/向我們顯示正在發生的事情的日誌。如果你還沒有已經,你應該把你的日誌最多調試(這樣的事情在log4j.properties):

log4j.logger.net.sf.hibernate=debug 
log4j.logger.net.sf.hibernate.SQL=debug 

和(persistence.xml中持久化單元)打開顯示SQL:

<property name="hibernate.show.sql" value="true" /> 

另外,我們需要看到合併的上下文 - 我認爲它是在Spring管理bean內完成的?另外,你是否標記了調用em.merge()作爲@Transactional的方法?如果你不是一個有效的事務裏面可能會失敗堅持它非常默默


更新:

凡em.merge()被稱爲自包含的方法是什麼?

註釋TransactionalAttribute.REQUIRED不會創建新的事務,所以除非您已經在事務中(例如調用方法註釋@Transactional),否則這將不起作用。

嘗試anotating與@Transactional的方法或者你可以使用TransactionalAttribute.REQUIRES_NEW - 儘管你應該認爲通過,因爲它意味着它永遠創建一個新的事務不管

+0

。 – 2011-05-20 14:22:40

0

我想你錯過了級聯設置..嘗試 -

@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)