java - 当在给定应用程序中调用增删改查操作时,SessionFactory 内部会做什么?

标签 java spring hibernate

我正在了解 spring + hibernate + java 集成。所以我对以下几点有了清晰的认识:

  1. Spring使用LocalSessionFactoryBean类来创建SessionFactory,它是hibernate类。
  2. 应用程序上下文加载数据源、 hibernate 属性等的定义。
  3. 我们可以在 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/

相关文章:

java - setFirstResult 和 setMaxResults 没有按预期工作

java - 如何使用 JPA 建模层次结构

java - 零如何影响除法的结果

java.lang.NoSuchMethodError : com. mongodb.MongoClient.<init>(Ljava/util/List;Lcom/mongodb/MongoCredential;Lcom/mongodb/MongoClientOptions;)V]

java - 在使用多个域对象的 Controller 中使用 Spring MVC Validator

java - 将对象保存在另一个对象中时出现 Hibernate getHibernateTemplate 问题

java - 如何在java反射中获取注解值

java - 为什么 System 类声明为 final 并带有私有(private)构造函数?

java - spring boot通过schema.sql导入程序

hibernate - JPA 2 Criteria API 中的 Hibernate Restrictions.sqlRestriction 等效吗?