hibernate fetch lazy: Initialize() 或 HQL

hibernate fetch lazy: Initialize() or HQL

今天我学习了一篇教程,作者解释了 hibernate 关联 one-to-many / many-to-one。 我不想在这里写他所有的代码。所以,我试着把重点放在主要...

我们有两个实体:“Team”和“Player

在代码中我们有:

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

@OneToMany(mappedBy="team", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> players;

我主要感兴趣的是获取类型。所以,我们插入了一个 team 和一些属于这个 teamplayers。 我的 DAO class 标有

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)

现在我想从数据库加载 team 实体,其中 collection 的 players.

Team team = new Team();
sessionFactory.getCurrentSession().get(team, id);

//and after somewhere in code
team.getPlayers();

结果我会得到LazyInitializationException。明明是...

我们可以解决这个问题:

Hibernate.initialize(team.getPlayers());

或者我们可以使用 HQL 加载 collection 玩家。我的意思是:

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

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

这是正确的解决方案吗?我应该在实际开发中使用其中的哪些?

还有一个问题。在我初始化 collection 个播放器后(无论我使用哪种解决方案)我都可以获得其中一个。好的,在 "player" 实体字段中,团队将初始化。为什么?而这个 team 将有填充玩家的 collection...我们有循环依赖...这正常吗?

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

而这种问题需要用什么方法,就看你的要求了。如果您在每个代理上调用 Hibernate.initialize,则每次调用都会生成一个查询。

下面你使用的是关节:-

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

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

有关详细信息,请查看 this link