在给定的应用程序中调用crud操作时,SessionFactory会在内部执行什么操作?

时间:2017-08-07 08:50:07

标签: java spring hibernate

我了解spring + hibernate + java集成。所以我在下面的给定点上得到了清晰的图片:

  1. Spring使用LocalSessionFactoryBean类创建SessionFactory,它是hibernate类。
  2. 应用程序上下文加载数据源,hibernate属性等的定义。
  3. 我们可以在spring dao类中注入SessionFactory类。 我的问题是关于crud操作调用,比如

    sessionfactory.getCurrentSession()。get( - , - )

  4. 在使用数据源或任何其他spring / hibernate相关资源方面,它如何在内部工作?

1 个答案:

答案 0 :(得分:1)

我尝试在高层解释发生了什么,有关详细信息,请查看源代码。

首先在您的代码行中调用2个方法:

    会话工厂
  • getCurrrentSession()
  • get(--,--)在返回的会话中

在第一种方法中,hibernate使用CurrentSessionContext来检索实际会话。 CurrentSessionContext实现基本上查看是否存在与您的线程和会话facotry相关的打开事务的打开会话并将其返回;如果您在此线程中对此DB执行某些操作并允许您继续操作,那么它会变得更简单。如果CurrentSessionContext找不到会话,则会创建新会话。 (注意,默认情况下有CurrentSessionContext的许多实现,使用JPA)

在检索会话后,执行第二种方法。在引用方言和其他对象的第二种方法中,生成本机sql查询。在您的特定情况下,sql通过会话发送到数据库,步骤如下:

  • 如果会话没有绑定到连接,请求池中的数据库连接
  • 通过连接发送sql并检索结果集
  • 获取结果集并将其转移到将返回的实体对象

如果你正在进行dml操作(更新,插入......),sql会在会话中被删除,并且会在刷新会话后发送(你可以使用flush()方法,否则只提交并等待休眠为你做的事)。重要提示,提交事务意味着代码将在DB上执行。在提交hibernate后,用自己的时间,将通过db连接打开一个事务(重要的hibernate transacion不是db事务)将执行所有生成的sql语句并将提交数据库事务。这是冲洗操作,请记住,由于您没有使用flush()方法手动强制冲洗,因此您无法准确知道冲洗何时发生。

希望这个肝脏 河