java - 如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表)

标签 java hibernate orm audit hibernate-envers

我正在使用 Hibernate Envers 4.2,我想从实体中的某些集合中获取仅包含详细信息的实体的修订版。

但我可以看到针对实体中的所有集合触发的 hibernate 查询导致性能问题。

也无法对集合使用 @NotAudited 注释来避免在此特定查询中,因为在其他情况下需要对这些集合进行审核。

例如,如果我的审计实体将这两个连接作为集合。 但是我希望获取实体修订的查询只获取地址信息而忽略订单信息,这可能吗?我不想用@NotAudited 注释订单信息,因为在其他情况下可能需要历史信息。

@ManyToOne
@JoinColumn(name="ADDR_ID")
public Address getAddress() { return address; }

@OneToMany
@JoinColumn(name="CUST_ID") 
public Set<Order> getOrders() {return orders;}

最佳答案

this Hibernate documentation example ,如果我有一个 CustomerAddress 关联:

@Audited( withModifiedFlag = true )
@Entity(name = "Customer")
public class Customer {

    ...

    @ManyToOne(fetch = FetchType.LAZY)
    private Address address;

}

然后我使用 this query 查询修订:

List<Customer> customers = AuditReaderFactory
.get( entityManager )
.createQuery()
.forRevisionsOfEntity( Customer.class, false, true )
.add( AuditEntity.id().eq( 1L ) )
.add( AuditEntity.property( "lastName" ).hasChanged() )
.getResultList();

Envers 仅查询Customers,而不是Address:

select
    c.id as id1_3_0_,
    c.REV as REV2_3_0_,
    defaultrev1_.REV as REV1_4_1_,
    c.REVTYPE as REVTYPE3_3_0_,
    c.REVEND as REVEND4_3_0_,
    c.created_on as created_5_3_0_,
    c.createdOn_MOD as createdO6_3_0_,
    c.firstName as firstNam7_3_0_,
    c.firstName_MOD as firstNam8_3_0_,
    c.lastName as lastName9_3_0_,
    c.lastName_MOD as lastNam10_3_0_,
    c.address_id as address11_3_0_,
    c.address_MOD as address12_3_0_,
    defaultrev1_.REVTSTMP as REVTSTMP2_4_1_
from
    Customer_AUD c cross
join
    REVINFO defaultrev1_
where
    c.id = ?
    and c.lastName_MOD = ?
    and c.REV=defaultrev1_.REV
order by
    c.REV asc

-- binding parameter [1] as [BIGINT]  - [1]
-- binding parameter [2] as [BOOLEAN] - [true]

除非您像这样导航关联:

AuditQuery innerJoinAuditQuery = AuditReaderFactory
.get( entityManager )
.createQuery()
.forEntitiesAtRevision( Customer.class, 1 )
.traverseRelation( "address", JoinType.INNER );

Hibernate Envers 不应将它们包含在 SQL 修订查询中。

关于java - 如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46183502/

相关文章:

java - 使用jdbc计算sql表的行数

java - Android 中的实时视频聊天流?

Java 8 流映射,将 null 保留为 null

java - 避免同一缓存区域的多次重新填充(由于并发)

entity-framework - 我可以在不将实体连接到数据库表的情况下使用 ORM 吗

orm - 如何使用 ClojureQL 向表添加索引?

java - 当 ejb-jar.xml 存在时,EJB3 注释将被忽略

java - hibernate 从数据库中检索数据后计算值

java - Hibernate @OneToMany 合并错误

java - JPA Embeddable 可以具有 ElementCollection<Embeddable> 属性