父表的主键未在Hibernate Envers的子表中更新

时间:2015-03-16 19:52:29

标签: hibernate hibernate-envers

我有一个父表 DataVO ,它有一个像这样的列表

@OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name= "DATA_NUM", nullable = false)
@AuditJoinTable(name="EP_DATA_STUS_AUD")
private List<DataStatusVO> dataStatusVOList = new ArrayList<DataStatusVO>();

DATA_NUM 是父表的主键。

除了 DATA_STUS_AUD 表中 DATA_NUM 为空之外,一切正常。     但是, DATA_NUM 填充在父级和联接表中(&#34; EP_DATA_STUS_AUD &#34;)。

我收到此错误,当我从

中删除insert = false和update = false时
@Column(name = "DATA_NUM")
private String dataNum;

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.envers.DuaStatusVO column: DATA_NUM (should be mapped with insert="false" update="false")

关于如何使这项工作的任何线索?

由于

1 个答案:

答案 0 :(得分:0)

Hibernate首先插入子元素,然后更新外键。在你的情况下,第一个插入Data_status的记录,然后休眠更新Data_num。

Envers拦截器仅针对save进行触发,savaOrUpdate函数不针对Update函数触发。在您没有Data_num的情况下将Data_Status插入到表中的情况下,会触发envers拦截器并将其复制并插入到Audit表中。

然后当hibernate更新外键时,不会调用envers。因此,您不会在审计表中获得任何Data_Num。

连接表从审计表中获取父表和子表的主键值,以及rev信息并插入记录。因此,在您的情况下,来自父表的Data_num和来自子表的Data_Status_num。

就错误而言,如果你想保持相同的父子关系,并删除insert = false,update = false,从@JoinColumn中删除nullable = false(name =“DATA_NUM”,可以为空父子关系中的= false)。