【问题标题】:hibernate-envers onetomany join class not audited, but join columns need to be auditedhibernate-envers onetomany join 类未审计,但 join 列需要审计
【发布时间】:2018-03-10 17:52:45
【问题描述】:

我正在尝试将连接列值保存在审计表中,而不是审计连接表。

这是我的实体类。

审核类信息:

@Entity
@Audited
@Table(name = "INFO")
public class Info extends AbstractEntity {

    @Id
    @Column(name = "ID")
    private String id;

    /*More Columns */ 

    @ManyToOne
    @JoinColumns({ @JoinColumn(name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"),
        @JoinColumn(name = "LAST_NAME", referencedColumnName = "LAST_NAME") })
    @NotAudited
    private Details details;


}

未审核类:详细信息:

@Entity
@Table(name = "DETAILS")
public class Details extends AbstractEntity {

    @EmbeddedId
    private DetailsPK detailsPK;
    /*More Columns */ 

}

这里定义了主键/连接字段:

@Embeddable
public class DetailsPK implements Serializable {

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;

}

这里,Details 信息是静态的……它不会改变……因此,不需要审核……但是,在审核 INFO 更改时,我希望 INFO_AUD 表同时捕获名字和姓氏name 以及...有没有办法指定这个?

谢谢你, 乔。

【问题讨论】:

  • 您找到解决方案了吗?我在这里遇到同样的问题...

标签: java hibernate join hibernate-envers


【解决方案1】:

由于你想要的字段是主键的一部分,你可以通过指定一个特殊的审计注释属性很容易地做到这一点:

@ManyToOne
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Details details;

简而言之,这指示 Envers 关联实体 Details 不是审计实体;但是,审计模式应该对关联实体的主键列进行快照。

所以您应该期望Info_AUD 有两列分别代表名称值details_FIRST_NAMEdetails_LAST_NAME

您不需要对您的数据模型执行任何其他特殊操作,因为 Envers 将确保在您更改与 Info 关联的 Details 对象时,名称列会在历史行快照中相应地更新。

【讨论】:

  • Naros,谢谢您的帮助...我尝试了上述解决方案...但审计表中的 first_name 和 last_name 仍未填充...另外,我的假设是在您的代码... details.getId() 方法是 details.getDetailsPK() 方法。我在 INFO 实体的阴影列中添加了 getter 和 setter。请告知...您能否也请详细说明为什么我们需要在详细信息设置器中使用 resolveAuditedShadowColumns 方法...我提前道歉,因为我对 envers 完全陌生并试图理解...
  • @Joe 我完全重写了答案。在做了一些实验之后,我之前的回答有点令人费解;我找到了一个更好的解决方案,它非常适合您的需求并避免了任何不必要的开销。
  • 我在发布我的问题之前尝试过这样做,但它没有工作......我重试以防万一......但它仍然无法工作......下面是代码行我试过了。 @ManyToOne @JoinColumns({ @JoinColumn(name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"), @JoinColumn(name = "LAST_NAME", referencedColumnName = "LAST_NAME") }) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 私有详细信息细节;注意:我的 Info_Aud 表有 FIRST_NAME 和 LAST_NAME 列,但没有 details_First_name 和 details_last_name 列。
  • 您使用的是什么版本的 Hibernate Envers?
  • 5.2.11.Final
猜你喜欢
  • 2023-03-24
  • 2015-12-14
  • 1970-01-01
  • 2011-06-13
  • 2018-09-19
  • 1970-01-01
  • 2018-04-18
  • 2013-06-03
  • 2015-08-20
相关资源
最近更新 更多