我了解spring + hibernate + java集成。所以我在下面的给定点上得到了清晰的图片:
我们可以在spring dao类中注入SessionFactory类。 我的问题是关于crud操作调用,比如
sessionfactory.getCurrentSession()。get( - , - )
在使用数据源或任何其他spring / hibernate相关资源方面,它如何在内部工作?
答案 0 :(得分:1)
我尝试在高层解释发生了什么,有关详细信息,请查看源代码。
首先在您的代码行中调用2个方法:
getCurrrentSession()
get(--,--)
在返回的会话中在第一种方法中,hibernate使用CurrentSessionContext
来检索实际会话。 CurrentSessionContext
实现基本上查看是否存在与您的线程和会话facotry相关的打开事务的打开会话并将其返回;如果您在此线程中对此DB执行某些操作并允许您继续操作,那么它会变得更简单。如果CurrentSessionContext
找不到会话,则会创建新会话。 (注意,默认情况下有CurrentSessionContext
的许多实现,使用JPA)
在检索会话后,执行第二种方法。在引用方言和其他对象的第二种方法中,生成本机sql查询。在您的特定情况下,sql通过会话发送到数据库,步骤如下:
如果你正在进行dml操作(更新,插入......),sql会在会话中被删除,并且会在刷新会话后发送(你可以使用flush()
方法,否则只提交并等待休眠为你做的事)。重要提示,提交事务意味着代码将在DB上执行。在提交hibernate后,用自己的时间,将通过db连接打开一个事务(重要的hibernate transacion不是db事务)将执行所有生成的sql语句并将提交数据库事务。这是冲洗操作,请记住,由于您没有使用flush()
方法手动强制冲洗,因此您无法准确知道冲洗何时发生。