【问题标题】:Hibernate Envers creating modified fields for foreign owned OneToMany relationshipsHibernate Envers 为外国拥有的 OneToMany 关系创建修改的字段
【发布时间】:2014-03-31 18:38:24
【问题描述】:

我正在使用 Hibernate 4.3.1.Final

如果我有两个实体,假设 A 和 B。A 包含一组 B 对象,这些对象被注释为 OneToMany 关联。
如果我将“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; }
}

还有其他人看过吗?除了用@Audited(withModifiedFlag=false) 注释我的每一个@ManyToOne 关系之外,我如何改变这种行为。我有成千上万的关系,所以即使测试那部分也会是一个巨大的痛苦。 另一种方法是强制数据库了解有关我们的 Java 代码的详细信息,而这些细节是业务不知道的,这使得添加双向关联变得更加困难。

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    对于以后可能会出现的人,至少从 4.3.1.Final 开始,这样做的唯一方法是删除全局配置标志并将该选项添加到每个类的 @Audited 注释中,以便它是@Audited(withModifiedFlag=true),然后将 @Audited(withModifiedFlag=false) 添加到该类中您不希望为其创建修改字段的每个属性(不是列!)。

    在其他 Hibernate 模块中,可以在类或属性级别覆盖全局配置选项。对于 Envers,永远不能覆盖全局配置选项。

    还要注意,修改后的字段名称是基于 Java 类中的属性名称,而不是 Hibernate ORM 的其余部分使用的 @Column 注释中的值。

    【讨论】:

    • 感谢“还请注意,修改后的字段名称基于 Java 类中的属性名称,而不是 Hibernate ORM 其余部分使用的 Column 注释中的值。”我在 Column 注释中使用名称值获取 DuplicateMappingException,JPA 将查找名称值列。将 Naming.physical-strategy 设置为 PhysicalNamingStrategyStandardImpl 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2012-10-25
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2017-09-14
    相关资源
    最近更新 更多