Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate Envers为外资拥有的OneToMany关系创建修改的字段_Java_Hibernate_Hibernate Envers - Fatal编程技术网

Java Hibernate Envers为外资拥有的OneToMany关系创建修改的字段

Java Hibernate Envers为外资拥有的OneToMany关系创建修改的字段,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,我使用的是Hibernate4.3.1.Final 如果我有两个实体,比如A和B。A包含一组B对象,这些对象被注释为OneToMany关联。 如果我将“org.hibernate.envers.global_with_modified_flag”设置为true,将“org.hibernate.envers.modified_flag_suffix”设置为“modified”,则envers会正确地为该表中具有指定后缀的所有列添加列,但它也希望为每一个协会找到一个修改过的栏目,即使它们是由外方拥有

我使用的是Hibernate4.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”、“foodomified”和“bObjectsModified”,而我认为它应该期望A中的列表示“foo”和“foodomified”,B中的列表示“aiddomified”

@实体
@表(A)
@审计
甲级{
私人字符串foo;
私有集对象;
@列(name=“foo”)
公共getFoo(返回foo;)
@OneToMany(fetch=FetchType.LAZY,
mappedBy=“a”)
公共集getBObjects(){return bObjects;}
}
@实体
@表(B)
@审计
B类{
私人A;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“aId”)
public getA(){return a;}
}
还有谁见过这个吗?除了注释我的
@ManyToOne
@Audited(withModifiedFlag=false)
的每一个关系外,我如何更改该行为。我有成千上万的关系,所以即使是测试这一部分也将是一个巨大的痛苦。
另一种方法是迫使数据库了解Java代码的详细信息,而这些信息是数据库不必知道的,这使得添加双向关联变得更加困难。

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

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


还请注意,修改后的字段名基于Java类中的属性名,而不是其他Hibernate ORM使用的
@列
注释中的值。

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

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


还请注意,修改后的字段名基于Java类中的属性名,而不是其他Hibernate ORM使用的
@列
注释中的值。

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

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


还请注意,修改后的字段名基于Java类中的属性名,而不是其他Hibernate ORM使用的
@列
注释中的值。

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

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

还请注意,修改后的字段名基于Java类中的属性名,而不是其他Hibernate ORM使用的
@列
注释中的值。

谢谢还要注意,修改后的字段名基于Java类中的属性名,而不是Hibernate ORM其余部分使用的列注释中的值。“我在列注释中使用名称值获得DuplicateMappingException,JPA将查找名称值列。将naming.physical-stratergy设置为PhysicalNamingStrategyStandardImpl解决了这个问题。感谢“还要注意,修改后的字段名基于Java类中的属性名,而不是Hibernate ORM其余部分使用的列注释中的值。”我在列注释中使用名称值获得DuplicateMappingException,JPA将查找名称值列。将naming.physical-stratergy设置为PhysicalNamingStrategyStandardImpl解决了这个问题。感谢“还要注意,修改后的字段名基于Java类中的属性名,而不是Hibernate ORM其余部分使用的列注释中的值。”我在列注释中使用名称值得到DuplicateMappingException,JPA将查找
@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; }
}