JPA 2.0 中的会话和事务有啥区别?
Posted
技术标签:
【中文标题】JPA 2.0 中的会话和事务有啥区别?【英文标题】:What is the difference between a session and a transaction in JPA 2.0?JPA 2.0 中的会话和事务有什么区别? 【发布时间】:2011-07-21 12:19:01 【问题描述】:我刚开始我的 JPA 2.0 研究,我有这段代码:
em = SessionFactory.startSession();
tx = em.getTransaction();
我的问题是:我不确定我是否完全理解使用会话和使用事务之间的区别。在几行中,谁能告诉我它们之间最大的区别?谢谢!
【问题讨论】:
developer.jboss.org/wiki/SessionsAndTransactions - 检查此链接 【参考方案1】:你去银行存两张支票,然后取出一小笔钱。
所以你排队,直到柜员开门。
您进行了首次存款。 然后是你的第二个。 然后你提款。
现在你已经完成了,你离开柜员线。
找到柜员就像创建您的会话,现在您在银行,准备工作。
每次存款和取款都是他们自己包含的工作,这些是您的交易。
当您完成工作并离开时,您将关闭或放弃会话。
所以,从本质上讲,会话包含您的交易,毕竟如果您从不去银行,您就无法进行银行存款,对吧?
【讨论】:
@David 谢谢,这也是我向人们描述网络会话请求/响应关系的方式。 为了完整起见,您可以在一个事务中拥有多个会话吗?我需要在餐馆付账——我没有足够的现金,所以我付了一半,去取款机取更多的钱,付完剩下的,然后交易就完成了。两个会话,一个事务。这可能吗? @asawyer: 那么什么会构成一个操作呢?操作与事务有何不同? 这种类比打破的一种方式:在休眠状态下,如果您“提交”单个事务,调用session.close()
将引发异常...
登录用户在 *** 上创建帖子、投票、评论等都发生在一个会话中。每个单独的动作都是一个事务。另一个类比。【参考方案2】:
会话是用来与数据库交互的。
事务用于指定会话在其中运行的边界。
本质上,事务通过只允许会话一次与其交互来防止数据库被破坏。 (这有点复杂,因为您可以从数据库读取许多事务,但只有一个事务正在写入。)
【讨论】:
【参考方案3】:em = SessionFactory.startSession();
在 JPA 中,没有 Session,也没有 SessionFactory。 SessionFactory 是一个特定于 hibernate 的接口,如果您使用 JPA,则不应使用它(使用 Hibernate 自己的 API 或使用 Hibernate 作为 JPA Provider,但不能同时使用两者。)
【讨论】:
我正在使用你所说的,hibernate 作为 JPA 提供者!所以,你的意思是我应该把标题写成“...in hibernate”而不是“...in JPA 2.0”,对吧?【参考方案4】:在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();
【讨论】:
以上是关于JPA 2.0 中的会话和事务有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
JPA 中的 CascadeType.REMOVE 和 orphanRemoval 有啥区别?
JPA 和 Hibernate 中的 persist() 和 merge() 有啥区别?
使用 JPA 时,@Entity 和 @Table 中的 name 参数有啥区别?
SwiftUI 2.0 中的 navigationBarTitle 和 navigationTitle 有啥区别? [复制]