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会话
或JPAEntityManager
执行任何特定的获取或查询。当您调用作业.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会话
或JPAEntityManager
执行任何特定的获取或查询。当您调用job.getComments()
collection时,Envers会为您无缝地处理此问题。job\u COMMENT\u AUD等同于什么实体?job\u COMMENT\u AUD不是实体。这只是一个由条令生成的审计表。你能详细说明一下吗?我用的是envers,不明白这件事。如果没有实体相关…就没有_AUD…据我所知…JOB _COMMENT _AUD等同于什么实体?JOB _COMMENT _AUD不是实体。这只是一个由条令生成的审计表。你能详细说明一下吗?我用的是envers,不明白这件事。如果没有实体相关…就没有_AUD…据我所知…有趣的是我不知道。谢谢你,尽管我不知道。谢谢