我正在使用Hibernate 4.3.1.Final
如果我有两个实体,让我们说A和B. A包含一组注释为OneToMany
关联的B对象。
如果我将“org.hibernate.envers.global_with_modified_flag”设置为true并将“org.hibernate.envers.modified_flag_suffix”设置为“Modified”,那么Envers会为该表中具有指定后缀的所有列正确添加列,但是也期望为每个协会找到一个修改后的列,即使它们归外方所有
在下面的例子中,Envers期望A中的列为“foo”“fooModified”和“bObjectsModified”,当我认为它应该期望A中的“foo”和“fooModified”以及B中的“aIdModified”。
@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代码的细节,这些代码没有业务知识,并且使得添加双向关联变得更加困难。
答案 0 :(得分:3)
对于那些可能稍后出现的人,至少从4.3.1.Final开始,唯一的方法是删除全局配置标志并将该选项添加到每个类的@Audited
注释中,以便它是@Audited(withModifiedFlag=true)
,然后将@Audited(withModifiedFlag=false)
添加到该类中不希望创建修改字段的每个属性(不是列!)。
在其他Hibernate模块中,可以在类或属性级别覆盖全局配置选项。对于Envers,永远不能覆盖全局配置选项。
另请注意,修改后的字段名称基于Java类中的属性名称,而不是Hibernate ORM其余部分使用的@Column
注释中的值。