daybreaksnow's diary

私を私と呼びたい

[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がクリアされている。