【问题标题】:Hibernate @Audited: NOT_AUDITED cannot be resolved to a variableHibernate @Audited:NOT_AUDITED 无法解析为变量
【发布时间】:2017-10-01 03:00:32
【问题描述】:

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

实体 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)。

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

NOT_AUDITED 无法解析为变量

我该如何解决这个问题?

【问题讨论】:

  • 您是否包含了envers jars?依赖?
  • 是的;否则eclipse会在@Audited注释处给我错误,但事实并非如此

标签: java hibernate annotations hibernate-mapping


【解决方案1】:

如果我在private EntityB b 上方添加@Audited(targetAuditMode = NOT_AUDITED),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)。然后,在读取实体的历史版本时,关系将始终指向“当前”相关实体

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 2021-12-21
    • 2012-02-29
    • 2020-12-07
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多