Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between a session and a transaction in JPA 2.0?

People also ask

What is a transaction in JPA?

An object level transaction is one in which a set of changes made to a set of objects are committed to the database as a single unit. JPA provides two mechanisms for transactions. When used in Java EE JPA provides integration with JTA (Java Transaction API).

What is Session SessionFactory and transaction in hibernate?

SessionFactory is a factory class for Session objects. It is available for the whole application while a Session is only available for particular transaction. Session is short-lived while SessionFactory objects are long-lived. SessionFactory provides a second level cache and Session provides a first level cache.

Does @transactional close Session?

@Transactional helps you to extend scope of Session . Session is open first time when getCurrentSession() is executed and it is closed when transaction ends and it is flushed before transaction commits.

What is difference between Session and EntityManager?

Session is a hibernate-specific API, EntityManager is a standardized API for JPA. You can think of the EntityManager as an adapter class that wraps Session (you can even get the Session object from an EntityManager object via the getDelegate() function).


You go to the bank to deposit 2 checks, and withdraw a small sum.

So you stand in line until a teller opens.

You make your first deposit.
Then your second.
Then you make your withdrawal.

Now you're done, you leave the teller line.

Getting to the teller is like creating your session, now you're in the bank, ready to work.

Each deposit and withdrawal are their own contained set of work, these are your transactions.

When you're done with your work and leave, you're closing or abandoning your session.


So, in essence, a session contains your transactions, after all you can't make a bank deposit if you never go to the bank right?


em = SessionFactory.startSession();

In JPA, there is no Session and no SessionFactory. SessionFactory is a hibernate-specific interface that you shouldn't use if you use JPA (use either Hibernate's own API or use Hibernate as JPA Provider, but not both.)


A session is what you use to interact with the database.

A transaction is used to specify boundaries for the session to operate within.

Essentially, transactions prevent the database from being corrupted by only allowing a session to interact with it at one time. (It's a bit more complicated then that, as you can have many transactions reading from the database, but only one transaction that's writing.)


In Hibernate, the transaction management is quite standard, just remember any exceptions thrown by Hibernate are FATAL, you have to roll back the transaction and close the current session immediately.

Here’s a Hibernate transaction template :

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