当前位置: 首页 > 知识库问答 >
问题:

hibernate fetch lazy:初始化()或HQL

冯阳云
2023-03-14

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

我们有两个实体:“团队”和“球员”

代码中,我们有:

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

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

我最感兴趣的是回迁的类型。所以,我们加入了一支球队和一些属于这支球队的球员。我的DAO类标记为

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

现在我想从数据库中加载充满玩家集合的团队实体。

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

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

结果是,我将得到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()));

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

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

共有1个答案

卫成和
2023-03-14

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

关于这种问题需要使用哪种方法,这取决于您的要求。如果你叫Hibernate。在每个代理上初始化,每个调用将生成一个查询。

以下是您使用的接头:-

查询查询=当前会话(). createQuery("from Player p wherep.team.id=: id");

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

有关更多信息,请查看此链接。

 类似资料:
  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的

  • new iSlider(DOM, DATA, OPTIONS) Name Type Description DOM dom 容器dom节点 DATA Array 数据列表 OPTIONS Object 配置项 DOM new iSlider(DOM, DATA, OPTIONS); {HTMLElement} 容器dom节点 作为第一个参数并不是必须的,会被OPTIONS.dom覆盖,但是这十分必

  • 确认初始化操作 1)初始化操作用来清空此统计ID的统计数据 2)与启用新的统计ID不同的是,初始化操作使您不需更换网站上的统计代码就可以重新开始统计 注意:初始化操作将清除此统计ID的所有统计数据,此操作不可恢复!!!

  • 创建版本库 git 基于文件夹(工作树)进行版本控制,在一个文件夹中创建 git版本库: $ cd project/ $ git init Initialized empty Git repository in .git/ 输出信息:在当前文件夹的 .git/ 目录下创建版本库 将文件提交到 git索引: git add file1 file2 file3 …… 更方便的作法是

  • 1. 引入sdk 下载wechat-mudu.min.js到小程序项目,建议放utils目录下 const Mudu = require('./utils/wechat-mudu.min') 2. 设置小程序code获取session_key地址 本方法已废弃 sdk会在初始化的时候获取用户的微信资料并设置到目睹平台,所以需要设置该地址用户获取用户openid, 详见用户 Mudu.setOp