我正在將項目從XML映射遷移到基於純JPA批註的映射,並且在嘗試刪除(刪除)以及實體及其子項時遇到問題。它適用於XML映射,不適用於註釋映射。註解映射與XML映射和刪除實體
XML映射看起來是這樣的:
<set name="evaluations" order-by="evalDate desc" table="Evaluation" lazy="true" inverse="true" cascade="delete">
<key column="requestId" />
<one-to-many class="org.stuff.model.Evaluation" />
</set>
註釋映射,據我所知是這樣的:
@OneToMany(orphanRemoval=true)
@JoinColumn(name = "requestId")
@OrderBy("evalDate DESC")
private Set<Evaluation> evaluations = new TreeSet<>();
這是一個單向的關係。
JPA的代碼刪除的實體是:
ServiceRequest sr = em.getReference(ServiceRequest.class, id);
em.remove(sr);
當上述Evaluation
是ServiceRequest
子對象。 Hibernate 4.3.7是我正在使用的JPA Impl,在WildFly 8.2上運行。
使用Hibernate設置爲BARF了其SQL,執行與到位的Hibernate的註釋映射刪除生成的查詢來查找實體引用,然後在remove
被稱爲它產生的更新試圖更新子在Evaluation
FK回ServiceRequest記錄爲空:
Hibernate: update Evaluation set requestId=null where requestId=?
這打擊了,因爲有上requestId
一個not null
約束。
如果我使用XML映射執行相同的操作(請參閱上面的代碼片段),它工作得很好。所有子實體都與父級一起刪除。而休眠只產生selects
和deletes
,如果從未嘗試更新什麼。
這感覺就像我有註解映射錯誤,但我無法確定我出錯的地方。請幫忙。
謝謝,這是正確的方向,稍作修改。在Hibernate中進行映射更改後,抱怨使用'mappedBy'和'@ JoinColumn'兩個例外:'標記爲mappedBy的關聯不能像@JoinTable或@JoinColumn那樣定義數據庫映射:hci.hrccadmin.model.ServiceRequest.evaluations' 。然後刪除'@ JoinColumn'後,它不喜歡'mappedBy =「ServiceRequest」',所以我將它改爲'mappedBy =「requestId」',因爲這是將ServiceRequest連接到評估的FK,並且似乎工作。似乎有點奇怪,但我想這是有道理的。 –
謝謝@sarahthebutterfly的答案。它真的再次移動。 –