【发布时间】:2021-05-24 05:33:37
【问题描述】:
我试图了解事情是如何运作的。我分别理解它们,但无法了解全貌。
在较低级别,使用 SQL 查询在数据库内执行的操作:
start transaction
insert A
insert B
commit
在更高级别,有 Hibernate 或任何其他 JPA 提供程序。事情需要手动管理(我没有放 try/catch/roolback 以使事情更容易阅读):
public saveAandB()
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(A);
session.save(B);
session.getTransaction().commit();
session.close();
最后,在更高的层次上,还有 Spring Transactions:
@Transactional
public void save(A,B) {
saveA(A);
saveB(B);
}
好的,我现在正试图了解它们之间的关系:
-
使用@Transactional,Spring 在我的服务开始时创建一个事务(使用从业务服务创建的代理)。
-
使用 Hibernate,我不再需要创建新的会话对象。我需要使用
getSession()而不是openSession()我可以将在同一个事务中执行的 saveA() 和 saveB() 方法分开(因为getSession()将返回同一个会话)
我也不需要管理 session.getTransaction().commit();不再在休眠层内。当我完成 saveA() 方法时,我进入以 getSession() 开头的 saveB() 方法。我从 saveA() 方法返回完全相同的会话。
当我的 save(A,B) 方法完成时,我的事务被提交,从而终止会话。
- 幕后:Spring 将创建一个 Hibernate Transaction。我在同一个事务中同时输入了 saveA() 和 saveB() 方法。那么Hibernate在创建真正的SQL查询时会生成SQL事务
start transaction和commit
这样对吗?
【问题讨论】:
标签: java hibernate jpa transactions spring-transactions