我有两个实体:
@Entity
@Table(name = "entity_a")
@Audited
public class EntityA {
@Column(name = "entity_a_uuid", columnDefinition = "char", updatable = false)
@Type(type = "uuid-char")
private UUID uuid = UUID.randomUUID();
/**
* @deprecated in favor of uuid
*/
@Deprecated
@Id
@GeneratedValue
@Column(name = "entity_a_id")
private Integer id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "entity_a_id", nullable = false)
@BatchSize(size = 100)
@NotAudited
private List<EntityB> entityBs = new ArrayList<>();
}
以及
@Entity
@Audited
@Table(name = "entity_b")
public class EntityB {
@Id
@Column(name = "entity_b_uuid", columnDefinition = "char", updatable = false)
@Type(type = "uuid-char")
private UUID uuid = UUID.randomUUID();
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "entity_a_id", nullable = false, insertable = false, updatable = false)
private EntityA entityA;
}
每一个都被正确地审计到两个表entity_a_audit
和entity_b_audit
中。但是,entity_b_audit
中的entity_a_id
字段 * 始终 * 为空。
一些细节:
1.如果EntityA
中没有@NotAudited
,我将得到一个错误消息,大意是:表EntityA_EntityB_audit
不存在,看起来它试图将它们作为一个表来审计,这是我不希望看到的。
1.我试过将@Audited(targetAuditMode = elationTargetAuditMode.NOT_AUDITED)
应用于每一面。如果只应用于EntityA
,我会得到上面的错误。如果只应用于EntityB
,什么都不会改变。如果同时应用于两个面,我会得到上面的错误。如果都不应用,我会得到上面的错误。
1.我怀疑entity_b_audit
中的entity_a_id
为空,因为在EntityA命中DB之前不会生成id。entity_a_id
在entity_a
表中自动递增。
1.使用hibernate-envers-5.4.32.Final.jar
最后,我希望entity_a_id
在entity_b_audit
中不为空,或者,如果我能以某种方式捕获entity_a_uuid
,也就足够了。
任何帮助将不胜感激!谢谢。
1条答案
按热度按时间gijlo24d1#
您将该列标记为
insertable = false, updatable = false
,因此这里没有什么要审计的,因为Hibernate永远不能更改该列的值。