在我们正在开发的这个应用程序中,我们注意到一个视图特别慢.我分析了视图并注意到hibernate执行了一个查询,即使数据库中只有两个对象要获取,也需要10秒.所有OneToMany和ManyToMany关系都是懒惰的,所以这不是问题.在检查正在执行的SQL时,我注意到查询中有超过80个连接.
进一步检查这个问题,我注意到问题是由实体类的深层次结构OneToOne和ManyToOne关系引起的.所以,我想,我只是让他们变得懒惰,这应该解决问题.但是,无论是标注@OneToOne(fetch=FetchType.LAZY)或@ManyToOne(fetch=FetchType.LAZY)似乎不工作.我得到一个异常,或者它们实际上并没有被代理对象替换,因此是懒惰的.
任何想法我将如何让这个工作?请注意,我不使用persistence.xml定义关系或配置细节,一切都在java代码中完成.
我目前正处于从Hibernate切换到纯JPA 2的过程中(顺便说一下,这比我最初期望的要长得多).
到目前为止,我遇到的最大问题是找到一种方法来强制加载懒惰属性.
使用Hibernate,这是使用:criteria.setFetchMode("person", FetchMode.JOIN);.
有没有办法用JPA 2做到这一点?
想象一下关系数据库中的2个表,例如Person和Billing.在这些实体之间定义了(非强制性)OneToOne关联,并且它们共享Person主键(即PERSON_ID在Person和Billing中定义,并且它是后者中的外键).
通过命名查询对Person进行选择时,例如:
from Person p where p.id = :id
Run Code Online (Sandbox Code Playgroud)
Hibernate/JPA生成两个选择查询,一个在Person表上,另一个在Billing表上.
上面的示例非常简单,并且不会导致任何性能问题,因为查询只返回一个结果.现在,假设Person有nOneToOne关系(均非强制性)与其他实体(所有共享Person主键).
如果我错了,请纠正我,但是select在Person上运行查询,返回r行,将导致(n+1)*rHibernate生成选择,即使这些关联是懒惰的.
是否存在针对此潜在性能灾难的解决方法(除了根本不使用共享主键)?谢谢你的所有想法.