gpt4 book ai didi

java - Hibernate Envers 为外资 OneToMany 关系创建修改字段

转载 作者:行者123 更新时间:2023-12-01 23:10:37 29 4
gpt4 key购买 nike

我正在使用 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 代码的详细信息,这使得添加双向关联变得更加困难。

最佳答案

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

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

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

关于java - Hibernate Envers 为外资 OneToMany 关系创建修改字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083666/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com