1

我最近通过 hibernate-enhance-maven-plugin 在我的 Hibernate 项目中引入了字节码增强。我真的需要能够延迟初始化某些字段以解决代表文档的实体中@Lob 字段的性能问题,并且延迟初始化整个实体不是一种选择。

但是,我发现在引入字节码增强后,我的其他 Lazy @ManyToOne 字段都无法获取。我执行包含 fetch 的查询,但在结果返回中所需的实体为 null。我知道该字段在数据库中不为空,如果我删除 hibernate-enhance-maven-plugin 并重新编译 fetch 按预期工作。

下面是我要检索的主要实体 (Office) 和我要获取的惰性 ManyToOne 实体 (Document)。

    @Entity
    @DynamicInsert
    @DynamicUpdate
    @SelectBeforeUpdate
    @Table(name="OFFICES")
    @Audited
    @Cacheable
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "myCache")
    public class Office implements Serializable {

        ....

        private Document businessPlan;
        @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
        @JoinColumn(name = "FK_DOCUMENT")
        @LazyToOne(LazyToOneOption.NO_PROXY)
        public Document getBusinessPlan() {
            return businessPlan;
        }
        public void setBusinessPlan(Document businessPlan) {
            this.businessPlan= businessPlan;
        }

        ....
    }

我设置了我的标准并尝试使用 JPQL 从数据库中提取。

    String hql = "select _it from com.mycom.model.Office _it left join fetch _it.businessPlan as a1_businessPlan where _it.id = :p1";
    Query query = session.createQuery(hql).setParameter("p1", officeId);
    return query.setCacheable(true).list();

如果我有字节码增强,这给了我我的办公室,但没有文档,如果我没有字节码增强,它给我我的办公室和我的文档。

我不知所措。从我在文档中可以阅读的内容来看,我应该正确设置它。我错过了一些东西,但我真的不知道它是什么。我曾尝试使用 CriteriaBuilder 作为测试,而只是看看它是否有所作为,但结果是相同的:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Office> query = builder.createQuery(Office.class);
Root<Office> root = query.from(Office.class);
root.fetch("businessPlan", JoinType.LEFT);
query.select(root).where(
        builder.equal(root.get("id"), officeId)
    );
Office testOffice = session.createQuery(query).getSingleResult();
System.out.println(testOffice.getBusinessPlan());//is null

更令人困惑的是,生成的 SQL 似乎是准确的。当我进行提取时,Hibernate 显示以下内容:

Hibernate: 
select 
    office0_.ID as ID1_94_0_, 
    ...
    document1_.ID as ID1_121_1_, 
    document1_.CONTENTTYPE as CONTENTTYPE2_121_1_, 
    document1_.DOCUMENTNAME as DOCUMENTNAME3_121_1_, 
    document1_.PDF as PDF4_121_1_ 
from 
    OFFICES office0_ left outer join DOCUMENTS document1_ on office0_.FK_DOCUMENT=document1_.ID 
where 
    office0_.ID=?

直接对我的数据库运行它给了我我正在寻找的纯原始术语

目前,我使用的是 Hibernate 5.4.2.Final,如您所见,它包括 Envers。

4

0 回答 0