我在数据库中的表上方创建休眠实体。

实体A是推介实体B

@Entity
@Table(name="TABLE_A")
@NamedQuery(.. query="SELECT n FROM EntityA n")
public class EntityA {
....
@ManyToOne(...)
@JoinColumn(...)
private EntityB b;


@Entity
@Table(name ="TABLE_B")
@NamedQuery(.. query="SELECT n FROM EntityB n")
public class EntityB {
...


唯一的问题是EntityA标记有@Audited批注(org.hibernate.envers.Audited),而EntityB没有。

发布应用程序时,在堆栈跟踪中出现以下错误:


  由以下原因引起:org.hibernate.MappingException:从EntityA到未经审核的实体EntityB的审核关系!这样的映射是可能的,
  但必须使用@Audited(targetAuditMode =
  NOT_AUDITED)。


如果我在@Audited(targetAuditMode = NOT_AUDITED)上方添加private EntityB b,Eclipse将显示以下错误

NOT_AUDITED无法解析为变量

我怎么解决这个问题?

最佳答案

如果我在@Audited(targetAuditMode = NOT_AUDITED)上方添加private EntityB b,Eclipse将显示以下错误
  
  NOT_AUDITED无法解析为变量


您没有正确使用targetAuditMode

@Audited(targetAuditMode = NOT_AUDITED)


错误的是,您应该使用RelationTargetAuditMode.NOT_AUDITED而不是NOT_AUDITED,因为RelationTargetAuditMode是一个ENUM,因此我们使用RelationTargetAuditMode.CONSTANT_NAME来访问其常量的值。

因此应该是:

@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)


说明文件:

我们可以从Hibernate Envers - Easy Entity Auditing Configuration看到这一点,它指示如何使用targetAuditMode属性:


  如果您要审核不审核目标实体的关系(例如,像字典一样的实体即不会更改且不必审核),只需用@Audited( targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。然后,在读取您实体的历史版本时,该关系将始终指向与“当前”相关的实体

关于java - Hibernate @Audited:NOT_AUDITED无法解析为变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43757338/

10-10 22:51