2014-02-28 54 views
0

修改字段我使用Hibernate 4.3.1.Final休眠Envers創造了外商獨資一對多關係

如果我有兩個實體,假設A和B A包含了一組被註釋作爲B對象OneToMany協會。
如果我將「org.hibernate.envers.global_with_modified_flag」設置爲true,並將「org.hibernate.envers.modified_flag_suffix」設置爲「Modified」,Envers會正確地爲該表中的所有列添加指定後綴的列,但它也希望爲每個協會找到一個修改的專欄,儘管他們是由外方所有。
在下面的例子中,當我認爲在A中需要期望列「foo」和「fooModified」並且在B中爲「aIdModified」時,Envers期望A中的列爲「foo」「fooModified」和「bObjectsModified」

@Entity 
@Table("A") 
@Audited 
class A { 
private String foo; 
private Set<B> bObjects; 

@Column(name = "foo") 
public getFoo(return foo;) 

@OneToMany(fetch = FetchType.LAZY, 
     mappedBy = "a") 
public Set<B> getBObjects() { return bObjects; } 
} 

@Entity 
@Table("B") 
@Audited 
class B { 
private A a; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "aId") 
public getA(){ return a; } 
} 

有沒有其他人看到過這個?除了註釋@ManyToOne@Audited(withModifiedFlag=false)之間的每一個關係以外,如何更改此行爲。我有成千上萬的關係,所以即使對這部分進行測試也將是一個巨大的痛苦。 另一種方法是迫使數據庫瞭解我們的Java代碼的詳細信息,它沒有業務知識,並且使添加雙向關聯變得更加困難。

回答

3

對於那些稍後可能會來的人,至少從4.3.1.Final開始,唯一的方法是刪除全局配置標誌,並將該選項添加到每個類的@Audited註釋中,使其成爲@Audited(withModifiedFlag=true)然後將@Audited(withModifiedFlag=false)添加到該類中您不希望創建修改字段的每個屬性(不是列!)。

在其他Hibernate模塊中,可以在類或屬性級別覆蓋全局配置選項。對於Envers,全局配置選項永遠不能被覆蓋。

另請注意,修改後的字段名稱基於Java類中的屬性名稱,而不是基於Hibernate ORM其餘部分使用的註釋值@Column

+0

感謝您「另請注意,修改的字段名稱基於Java類中的屬性名稱,而不是Hibernate ORM其餘部分使用的Column註釋中的值。我在Column註釋中使用名稱值獲取DuplicateMappingException,並且JPA將查找名稱值列。將命名。物理 - 精靈設置爲PhysicalNamingStrategyStandardImpl解決了這個問題。 – tweekran