我正在了解 spring + hibernate + java 集成。所以我对以下几点有了清晰的认识:
- Spring使用LocalSessionFactoryBean类来创建SessionFactory,它是hibernate类。
- 应用程序上下文加载数据源、 hibernate 属性等的定义。
我们可以在 spring dao 类中注入(inject) SessionFactory 类。 我的问题是关于 CRUD 操作调用,例如
sessionfactory.getCurrentSession().get(--, -)
它在使用数据源或任何其他 spring/hibernate 相关资源方面如何内部工作?
最佳答案
我尝试从高层次解释发生了什么,有关更多详细信息,您可以查看源代码。
首先在您的代码行中调用了 2 个方法:
session 工厂上的 getCurrrentSession()
在返回的 session 中获取(--,--)
在第一个方法中,hibernate 使用 CurrentSessionContext
来检索实际 session 。 CurrentSessionContext
实现实际上会查找是否存在一个打开的 session 以及与您的线程和 session 工厂相关的打开的事务,然后返回它;为了使它更简单,它看起来是否您正在该线程中的该数据库上执行某些操作并允许您继续。如果 CurrentSessionContext
找不到 session ,则会创建一个新 session 。 (请注意,CurrentSessionContext
有多种实现,默认使用 JPA 之一)
检索 session 后,执行第二个方法。在引用方言和其他对象的第二种方法中,生成 native SQL 查询。在您的具体情况下,sql 通过 session 发送到数据库,步骤如下:
- 如果 session 未绑定(bind)到连接,则从池中请求数据库连接
- 通过连接发送 sql 并检索结果集
- 获取结果集并将其转换为将返回的实体对象
如果您正在执行 dml 操作(更新、插入...),则 sql 在 session 上被破坏,并将在刷新 session 后发送(您可以使用 flush()
方法它,否则只需提交并等待 hibernate do ti 为你)。重要提示,提交事务意味着代码将在数据库上执行。提交hibernate后,按照自己的时间,将通过数据库连接打开一个事务(重要的hibernate事务不是数据库事务)将执行所有生成sql语句并提交数据库事务。这是刷新操作,请记住,您并不确切知道刷新何时发生,因为您没有使用 flush()
方法手动强制执行。
希望这个帮助 r.
关于java - 当在给定应用程序中调用增删改查操作时,SessionFactory 内部会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542876/