[Hibernate]session.beginTransactionを複数回呼んだ場合の挙動
session.beginTransactionを呼んだ後、そのトランザクションがコミットorロールバックされる前に、もう一度beginTransactionを呼ぶと同じインスタンスが返される。
そのため、以下のようなコードはエラーとなる。
private void saveItem(Session session) { Transaction tx = session.beginTransaction(); Item item = new Item(); session.save(item); saveBid(session); tx.commit(); session.close(); } private void saveBid(Session session) { Transaction tx = session.beginTransaction(); Bid bid = new Bid(); session.save(bid); tx.commit(); }
新しいトランザクションが返されるかどうかはJDBCContext.hibernateTransactionがnullかどうかで決まり、Transaction.commit内でJDBCContext.afterTransactionCompletionを呼ぶことでhibernateTransactionがクリアされている。