【问题标题】: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();

我的问题是:我不确定我是否完全理解使用会话和使用事务之间的区别。在几行中,谁能告诉我它们之间最大的区别?谢谢!

【问题讨论】:

标签: java hibernate orm jpa persistence


【解决方案1】:

你去银行存两张支票,然后取出一小笔钱。

所以你排队,直到柜员开门。

您进行了首次存款。
然后是你的第二个。
然后你提款。

现在你已经完成了,你离开柜员线。

找到柜员就像创建您的会话,现在您在银行,准备工作。

每次存款和取款都是他们自己包含的工作,这些是您的交易。

当您完成工作并离开时,您将关闭或放弃会话。


所以,从本质上讲,会话包含您的交易,毕竟如果您从不去银行,您就无法进行银行存款,对吧?

【讨论】:

  • @David 谢谢,这也是我向人们描述网络会话请求/响应关系的方式。
  • 为了完整起见,您可以在一个事务中拥有多个会话吗?我需要在餐馆付账——我没有足够的现金,所以我付了一半,去取款机取更多的钱,付完剩下的,然后交易就完成了。两个会话,一个事务。这可能吗?
  • @asawyer: 那么什么会构成一个操作呢?操作与事务有何不同?
  • 这种类比打破的一种方式:在休眠状态下,如果您“提交”单个事务,调用session.close() 将引发异常...
  • 登录用户在 stackoverflow 上创建帖子、投票、评论等都发生在一个会话中。每个单独的动作都是一个事务。另一个类比。
【解决方案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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2015-05-10
      • 2011-09-14
      • 2011-05-27
      • 2011-07-04
      • 1970-01-01
      • 2016-05-10
      • 2018-08-05
      • 2011-08-06
      相关资源
      最近更新 更多