JPA 2.0中的会话和事务有什么区别?

时间:2011-03-23 17:15:36

标签: java hibernate orm jpa persistence

我刚刚开始我的JPA 2.0研究,我有这段代码:

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

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

4 个答案:

答案 0 :(得分:103)

你到银行存入2张支票,并提取一笔小额款项。

所以你排队直到柜员打开。

您首次存款。
然后你的第二个。
然后你退出。

现在你已经完成了,你离开了出纳员。

到达出纳员就像创建会话一样,现在你在银行里,准备工作。

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

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


所以,从本质上讲,会话中包含您的交易,如果您从未进入银行,那么您无法进行银行存款吗?

答案 1 :(得分:10)

em = SessionFactory.startSession();

在JPA中,没有Session,也没有SessionFactory。 SessionFactory是一个特定于hibernate的接口,如果你使用JPA就不应该使用它(使用Hibernate自己的API或者使用Hibernate作为JPA Provider,但不能同时使用两者。)

答案 2 :(得分:5)

会话是您用来与数据库交互的内容。

交易用于指定会话的边界​​。

实质上,事务通过仅允许会话一次与其进行交互来防止数据库被破坏。 (它有点复杂,因为你可以从数据库读取许多事务,但只有一个事务正在编写。)

答案 3 :(得分:3)

在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();
        }
    }