JPA 2.0中,Session和Transaction有什么区别?

56

我刚开始学习JPA 2.0,我有一段代码:

em = SessionFactory.startSession();
tx = em.getTransaction();

我的问题是:我不确定自己完全理解使用会话和使用事务之间的区别。能否请有经验的人在几句话中告诉我它们之间最大的区别?谢谢!


请查看此链接:https://developer.jboss.org/wiki/SessionsAndTransactions - Bharat
4个回答

141
你去银行存两张支票,然后取一小笔钱。
于是你站在队伍里等待柜员开放。
你进行了第一次存款。 然后是第二次存款。 接着你进行了取款。
现在你完成了,离开了柜员线。
到达柜员就像创建你的会话一样,现在你在银行里,准备工作。
每个存款和取款都是一个独立的工作集,这些是你的交易。
当你完成工作并离开时,你要么结束或放弃会话。
因此,本质上,一个会话包含了你的交易。毕竟如果你从未去过银行,你就无法进行银行存款,对吧?

1
@David 谢谢,这也是我向人们描述Web会话请求/响应关系的方式。 - asawyer
1
为了完整性,您能否在单个事务内拥有多个会话?我需要在餐厅付账——我没有足够的现金,所以我支付一半,走出去到取款机上取些更多的钱,支付剩下的金额,然后事务完成。这是两个会话,一个事务。这种情况可能吗? - rghome
@asawyer:那什么构成了一个操作呢?操作和事务有何不同? - Farhan stands with Palestine
这个类比的一个缺陷是:在Hibernate中,如果你“提交”了一个单独的事务,在调用session.close()时会抛出异常... - Don Cheadle
2
在stackoverflow上,已登录用户创建帖子、点赞、评论等操作都发生在一个会话中。每个单独的操作都是一个事务。另一个类比。 - HopeKing

10
em = SessionFactory.startSession();
在JPA中,没有Session和SessionFactory。SessionFactory是一个特定于Hibernate的接口,如果你使用JPA,就不应该使用它(可以使用Hibernate自己的API或将Hibernate作为JPA提供者,但不要两者同时使用)。

我正在使用你所说的,将Hibernate作为JPA提供程序!所以,你的意思是我应该把标题写成“...在Hibernate中”,而不是“...在JPA 2.0中”,对吗? - user645579

8

会话是您用来与数据库交互的方式。

事务用于指定会话操作的边界。

实际上,事务通过只允许一个会话与其交互来防止数据库被损坏。(这比较复杂,因为您可以有许多事务从数据库中读取,但只有一个事务在写入。)


3
在Hibernate中,事务管理非常标准。请记住,任何由Hibernate抛出的异常都是致命的,您必须立即回滚事务并关闭当前会话。以下是一个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();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接