Java 当FetchType设置为LAZY时,将从数据库加载实体
在某些类中,我不得不将fetchtype从渴望更改为懒惰,以防止Hibernate加载所有关联的实体,但更改fetchtype似乎不起作用,实体仍然像以前一样加载。我还看到Hibernate首先运行一个SELECT来加载所有文档,然后对每个相关的概要文件(如果它们不同)运行一个单独的SELECT。取决于某些文档是否与同一配置文件相关。所以,如果我有10个不同配置文件的文档,那么Hibernate将运行11个SELECT查询。我不确定这是否是正常行为 我已经尝试在两侧将fetchtype设置为LAZY,甚至删除了Profile侧的关系Java 当FetchType设置为LAZY时,将从数据库加载实体,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,在某些类中,我不得不将fetchtype从渴望更改为懒惰,以防止Hibernate加载所有关联的实体,但更改fetchtype似乎不起作用,实体仍然像以前一样加载。我还看到Hibernate首先运行一个SELECT来加载所有文档,然后对每个相关的概要文件(如果它们不同)运行一个单独的SELECT。取决于某些文档是否与同一配置文件相关。所以,如果我有10个不同配置文件的文档,那么Hibernate将运行11个SELECT查询。我不确定这是否是正常行为 我已经尝试在两侧将fetchtype设置为LA
public class Profile {
@OneToMany(mappedBy = "profile", fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.REFRESH })
private List<Document> documents;
EntityManager em=_emf.createEntityManager();
试一试{
Query Query=em.createQuery(“按d.id DESC从文档d订单中选择d”);
List documents=query.getResultList();
归还文件;
}最后{
em.close();
}
我希望Hibernate只加载数据库中的文档,而不加载相关的配置文件。我假设您的
文档
实际上是配置文件
。在这种情况下,您可能需要在@ManyToOne
上设置optional=false
。这是必要的,因为Hibernate必须在获取过程中设置字段document
,要么为null,要么为代理,要么为对象。使用默认值optional=true
,Hibernate无法排除空值情况,因此无法设置延迟加载所需的非空代理。@感谢您捕获到这一点。我尝试了optional=false
,但没有效果。奇怪的是,如果我设置了FetchType.LAZY
,并在关闭实体管理器后尝试访问配置文件,它会说:未能延迟初始化角色集合…“延迟加载”并不意味着“不加载”。这意味着延迟加载关联,即第一次访问集合时(调用其任何方法)。我假设您的文档
实际上是配置文件
。在这种情况下,您可能需要在@ManyToOne
上设置optional=false
。这是必要的,因为Hibernate必须在获取过程中设置字段document
,要么为null,要么为代理,要么为对象。使用默认值optional=true
,Hibernate无法排除空值情况,因此无法设置延迟加载所需的非空代理。@感谢您捕获到这一点。我尝试了optional=false
,但没有效果。奇怪的是,如果我设置了FetchType.LAZY
,并在关闭实体管理器后尝试访问配置文件,它会说:未能延迟初始化角色集合…“延迟加载”并不意味着“不加载”。这意味着延迟加载关联,即第一次访问集合时(调用其任何方法)。
public abstract class Document {
@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.REFRESH })
@JoinColumn(name = "profile_id")
private Profile profile;
EntityManager em = _emf.createEntityManager();
try {
Query query = em.createQuery("SELECT d FROM Document d ORDER BY d.id DESC");
List<Document> documents = query.getResultList();
return documents;
} finally {
em.close();
}