我有一个父表 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")
关于如何使这项工作的任何线索?
由于
答案 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)。