Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当FetchType设置为LAZY时,将从数据库加载实体_Java_Hibernate_Jpa_Jpql - Fatal编程技术网

Java 当FetchType设置为LAZY时,将从数据库加载实体

Java 当FetchType设置为LAZY时,将从数据库加载实体,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,在某些类中,我不得不将fetchtype从渴望更改为懒惰,以防止Hibernate加载所有关联的实体,但更改fetchtype似乎不起作用,实体仍然像以前一样加载。我还看到Hibernate首先运行一个SELECT来加载所有文档,然后对每个相关的概要文件(如果它们不同)运行一个单独的SELECT。取决于某些文档是否与同一配置文件相关。所以,如果我有10个不同配置文件的文档,那么Hibernate将运行11个SELECT查询。我不确定这是否是正常行为 我已经尝试在两侧将fetchtype设置为LA

在某些类中,我不得不将fetchtype从渴望更改为懒惰,以防止Hibernate加载所有关联的实体,但更改fetchtype似乎不起作用,实体仍然像以前一样加载。我还看到Hibernate首先运行一个SELECT来加载所有文档,然后对每个相关的概要文件(如果它们不同)运行一个单独的SELECT。取决于某些文档是否与同一配置文件相关。所以,如果我有10个不同配置文件的文档,那么Hibernate将运行11个SELECT查询。我不确定这是否是正常行为

我已经尝试在两侧将fetchtype设置为LAZY,甚至删除了Profile侧的关系

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();
}