Java hibernate抓取延迟:初始化()或HQL
今天我学习了一个教程,作者在其中解释了hibernate的一对多/多对一关联。 我不想把他所有的代码都写在这里。所以,我试着把重点放在 我们有两个实体:“团队”和“玩家” 在代码中,我们有: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。很明显
@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()));