【发布时间】:2011-07-21 12:19:01
【问题描述】:
我刚开始我的 JPA 2.0 研究,我有这段代码:
em = SessionFactory.startSession();
tx = em.getTransaction();
我的问题是:我不确定我是否完全理解使用会话和使用事务之间的区别。在几行中,谁能告诉我它们之间最大的区别?谢谢!
【问题讨论】:
标签: java hibernate orm jpa persistence
我刚开始我的 JPA 2.0 研究,我有这段代码:
em = SessionFactory.startSession();
tx = em.getTransaction();
我的问题是:我不确定我是否完全理解使用会话和使用事务之间的区别。在几行中,谁能告诉我它们之间最大的区别?谢谢!
【问题讨论】:
标签: java hibernate orm jpa persistence
你去银行存两张支票,然后取出一小笔钱。
所以你排队,直到柜员开门。
您进行了首次存款。
然后是你的第二个。
然后你提款。
现在你已经完成了,你离开柜员线。
找到柜员就像创建您的会话,现在您在银行,准备工作。
每次存款和取款都是他们自己包含的工作,这些是您的交易。
当您完成工作并离开时,您将关闭或放弃会话。
所以,从本质上讲,会话包含您的交易,毕竟如果您从不去银行,您就无法进行银行存款,对吧?
【讨论】:
session.close() 将引发异常...
会话是用来与数据库交互的。
事务用于指定会话在其中运行的边界。
本质上,事务通过只允许会话一次与其交互来防止数据库被破坏。 (这有点复杂,因为您可以从数据库读取许多事务,但只有一个事务正在写入。)
【讨论】:
em = SessionFactory.startSession();
在 JPA 中,没有 Session,也没有 SessionFactory。 SessionFactory 是一个特定于 hibernate 的接口,如果您使用 JPA,则不应使用它(使用 Hibernate 自己的 API 或使用 Hibernate 作为 JPA Provider,但不能同时使用两者。)
【讨论】:
在Hibernate中,事务管理是相当标准的,只要记住Hibernate抛出的任何异常都是FATAL,你必须立即回滚事务并关闭当前会话。
这是一个 Hibernate 事务模板:
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
tx.setTimeout(5);
//doSomething(session);
tx.commit();
}catch(RuntimeException e){
try{
tx.rollback();
}catch(RuntimeException rbe){
log.error("Couldn’t roll back transaction", rbe);
}
throw e;
}finally{
if(session!=null){
session.close();
}
}
【讨论】: