Hibernate 如何读取与标记为“未审核”的关联相关的修改

Hibernate 如何读取与标记为“未审核”的关联相关的修改,hibernate,hibernate-envers,Hibernate,Hibernate Envers,在我的用例中,我有一个作业,这个作业有注释。由于您无法编辑评论,我不想审核此实体。 以下是代码: @Audited(withModifiedFlag = true) @Entity @Table(name = "JOB") public class Job { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Integer id; @Audited(target

在我的用例中,我有一个作业,这个作业有注释。由于您无法编辑评论,我不想审核此实体。 以下是代码:

@Audited(withModifiedFlag = true)
@Entity
@Table(name = "JOB")
public class Job {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Integer id;

  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "j_id")
  private List<Comment> comments;
}

@Entity
@Table(name = "COMMENT")
public class Comment {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Integer id;

  @Column(name = "title")
  private String title;

  @Column(name = "text")
  private String text;
}
@Audited(withModifiedFlag=true)
@实体
@表(name=“JOB”)
公开课工作{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私有整数id;
@已审核(targetAuditMode=关系targetAuditMode.未审核)
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“j_id”)
私人名单评论;
}
@实体
@表(name=“COMMENT”)
公开课评论{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”)
私有整数id;
@列(name=“title”)
私有字符串标题;
@列(name=“text”)
私有字符串文本;
}
现在我希望能够获取与
注释相关的所有修改。
当然,Hibernate不会生成注释表。但它会生成一个JOB\u COMMENT\u AUD表

如何从
AuditReader
获取相应的注释实体?我只能使用AuditReader读取作业实体。或者换句话说:我需要通过AuditReader访问作业、评论和条目


无论如何,必须能够通过AuditReader获得相应的注释实体。否则,为什么hibernate应该将关系审核到自动生成的JOB\u COMMENT\u AUD表中

首先,了解
RelationalTargetAuditMode.NOT_AUDITED
的功能非常重要

此注释将使enver生成一个联接表,该联接表维护已审核实体
作业
注释
实体的ORM数据表之间的外键到主键关系

换句话说,Envers不会复制
注释
实体的审核模式中的任何列,而是只捕获主键,以便在填充已审核的
作业
实例时,它知道如何正确设置
注释
的集合

AuditReader
,只能查询
作业
类型。这是因为您只标记了要审核的
作业
类型,而没有标记
注释
类型。但这并不意味着当您获得一个
作业的已审核实例时,您无法获取相关的
注释

final AuditReader auditReader = AuditReaderFactory.get( entityManager );

// Get the first revision of Job with id jobId
// This Job has 2 comments, so here we can get them easily.
final Job job = auditReader.find( Job.class, jobId, 1 );
assertEquals( 2, job.getComments().size() );
assertEquals( "Hello World", job.getComments().get( 0 ).getText() );
assertEquals( "Goodbye World", job.getComments().get( 1 ).getText() );
Envers所做的是用代理包装
Comment
集合,这样当代码首次尝试访问它时,它会检查集合是否已初始化。如果没有,它将基于一个专门的查询填充集合,该查询知道如何获取有关当前
作业
实体、
作业注释
表和实体的基本
注释
表的修订数据,并加载实体数据

换句话说,代理初始化会为您触发如下查询:

SELECT c.* 
  FROM Comment c, 
       Job_Comment_AUD jc 
 WHERE jc.job_id = :jobId
   AND jc.revision = :jobRevision
   AND jc.comment_id = c.id     

美妙之处在于您的代码不需要使用Hibernate
会话
或JPA
EntityManager
执行任何特定的获取或查询。当您调用
作业.getComments()
集合时,Envers会无缝地为您处理此问题。

首先,了解
RelationalTargetAuditMode.NOT\u AUDITED
的功能非常重要

此注释将使enver生成一个联接表,该联接表维护已审核实体
作业
注释
实体的ORM数据表之间的外键到主键关系

换句话说,Envers不会复制
注释
实体的审核模式中的任何列,而是只捕获主键,以便在填充已审核的
作业
实例时,它知道如何正确设置
注释
的集合

AuditReader
,只能查询
作业
类型。这是因为您只标记了要审核的
作业
类型,而没有标记
注释
类型。但这并不意味着当您获得一个
作业的已审核实例时,您无法获取相关的
注释

final AuditReader auditReader = AuditReaderFactory.get( entityManager );

// Get the first revision of Job with id jobId
// This Job has 2 comments, so here we can get them easily.
final Job job = auditReader.find( Job.class, jobId, 1 );
assertEquals( 2, job.getComments().size() );
assertEquals( "Hello World", job.getComments().get( 0 ).getText() );
assertEquals( "Goodbye World", job.getComments().get( 1 ).getText() );
Envers所做的是用代理包装
Comment
集合,这样当代码首次尝试访问它时,它会检查集合是否已初始化。如果没有,它将基于一个专门的查询填充集合,该查询知道如何获取有关当前
作业
实体、
作业注释
表和实体的基本
注释
表的修订数据,并加载实体数据

换句话说,代理初始化会为您触发如下查询:

SELECT c.* 
  FROM Comment c, 
       Job_Comment_AUD jc 
 WHERE jc.job_id = :jobId
   AND jc.revision = :jobRevision
   AND jc.comment_id = c.id     

美妙之处在于您的代码不需要使用Hibernate
会话
或JPA
EntityManager
执行任何特定的获取或查询。当您调用
job.getComments()
collection时,Envers会为您无缝地处理此问题。

job\u COMMENT\u AUD等同于什么实体?job\u COMMENT\u AUD不是实体。这只是一个由条令生成的审计表。你能详细说明一下吗?我用的是envers,不明白这件事。如果没有实体相关…就没有_AUD…据我所知…JOB _COMMENT _AUD等同于什么实体?JOB _COMMENT _AUD不是实体。这只是一个由条令生成的审计表。你能详细说明一下吗?我用的是envers,不明白这件事。如果没有实体相关…就没有_AUD…据我所知…有趣的是我不知道。谢谢你,尽管我不知道。谢谢