將實體類(Song)與@OneToMany映射到另一個實體(CoverArt)並級聯設置爲ALL,因爲看起來更容易保存主entiy讓它來堅持封面在休眠時使用CascadeType.ALL保存頂級實體會導致對相關實體的不必要更新
@Audited
@Entity
public class Song
{
@Id
@GeneratedValue
private Integer recNo;
@Version
private int version;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
private List<CoverArt> coverArts;
....
}
的照顧,而且我發現在代碼稍後,如果我只是檢索和數據庫中的類的實例,然後會在短短修改歌曲實體中的一個字段會導致它更新與該歌曲鏈接的所有封面藝術實體,即使封面藝術沒有任何改變,爲什麼它會這樣做?
此外,我不認爲它會導致問題,但我正在使用Envers,並且對CoverArt表的(看似)不必要的額外更新具有造成Envers創建不必要的審計表的敲擊作用。
如果我刪除CascadeType註釋修改一個字段不會導致封面藝術實體更新,並且一切正常,只要我添加額外的邏輯,當我添加封面藝術,但我希望我沒有'不需要這樣做。
你以某種方式改變coverArts收集的實例?可能是因爲休眠失去了更改跟蹤。另外,如果CoverArt對Song有反向引用,最好在@OneToMany上反轉= true。 – Firo 2012-02-29 13:02:40
這是什麼意思,我沒有對coverart做任何修改。它沒有反向引用, – 2012-02-29 14:28:15
Hibernate以某種方式認爲CoverArts已經改變。如果Hibernate設置爲字段的集合被交換,或者如果所有屬性的值都不相等,因爲它們以某種方式更改,那麼引用父對象。爲CoverArt設置dynamicupdate = true以查看哪些字段實際上正在更改。 – Firo 2012-02-29 15:26:53