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 有啥区别? [复制]

IIS中的会话超时和空闲超时有啥区别?

JPA 和 JDO 规范有啥区别?