有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我使用的是HibernateEnvers 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;}

共 (1) 个答案

  1. # 1 楼答案

    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修订查询中