Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 hibernate抓取延迟:初始化()或HQL_Java_Hibernate_Fetch_Lazy Initialization - Fatal编程技术网

Java hibernate抓取延迟:初始化()或HQL

Java hibernate抓取延迟:初始化()或HQL,java,hibernate,fetch,lazy-initialization,Java,Hibernate,Fetch,Lazy Initialization,今天我学习了一个教程,作者在其中解释了hibernate的一对多/多对一关联。 我不想把他所有的代码都写在这里。所以,我试着把重点放在 我们有两个实体:“团队”和“玩家” 在代码中,我们有: @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="team_id") private Team team; 及 现在,我想从数据库中加载团队实体,其中包含填充的玩家集合 在结果中,我将得到LazyInitializationException。很明显

今天我学习了一个教程,作者在其中解释了hibernate的一对多/多对一关联。 我不想把他所有的代码都写在这里。所以,我试着把重点放在

我们有两个实体:“团队”和“玩家

在代码中,我们有:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="team_id")
private Team team;

现在,我想从数据库中加载团队实体,其中包含填充的玩家集合

在结果中,我将得到
LazyInitializationException
。很明显

我们可以解决这个问题:

Hibernate.initialize(team.getPlayers());
或者我们可以使用HQL加载玩家集合。我的意思是:

Query query = currentSession().createQuery("from Player p where p.team.id =:id");
query.setParameter("id",key);

team.setPlayers(new HashSet(query.list()));
这是正确的解决方案吗?我应该在实际开发中使用哪一个


还有一个问题。初始化播放器集合后(无论使用哪种解决方案),我都可以得到其中一个。好的,在“玩家”实体字段中,团队将初始化。为什么?这支队伍将充满球员的收藏。。。我们有循环依赖关系。。。这是正常的吗

LazyInitializationException在会话关闭并且您试图从分离的对象加载惰性对象时出现。在这里,团队是分离对象(因为会话可能在此调用之前已关闭)并尝试加载惰性对象播放器

对于这类问题需要使用哪种方法,这取决于您的要求。如果在每个代理上调用Hibernate.initialize,则每个调用将生成一个查询

以下是您正在使用的接头:-

Query Query=currentSession().createQuery(“来自播放器p,其中p.team.id=:id”)

这只需要一次查询,我认为如果您查询大量数据,应该使用这种方法


有关更多信息,请查看。

您是否在
sessionFactory.getCurrentSession().get(团队,id)之后关闭了Hibernate会话行?会话还活着吗?我使用Spring,我希望Spring框架能够关闭会话。或者我错了?我不知道你用的是哪种弹簧配置。但是根据我之前对
team.getPlayers()的理解调用,会话可能已关闭,团队对象已从会话分离。这可能就是这个错误的原因。如果您试图从分离的对象延迟加载,那么您将得到这种错误。Anchit Pancholi谢谢。你是对的。会话可能在
get(团队,id)
之后关闭。在我调用
team.getPlayers()
之后,我得到LazyInitializationException,因为我设置了
fetch=FetchType.LAZY
而不是
fetch=FetchType.EAGER
。我不反对这个事实。这是正常的。。。我询问了手动初始化播放器集合的问题:使用方法initialize()或HQL。你喜欢哪一个?
Team team = new Team();
sessionFactory.getCurrentSession().get(team, id);

//and after somewhere in code
team.getPlayers();
Hibernate.initialize(team.getPlayers());
Query query = currentSession().createQuery("from Player p where p.team.id =:id");
query.setParameter("id",key);

team.setPlayers(new HashSet(query.list()));