1
//$Id: CacheSynchronization.java 9239 2006-02-08 22:34:34Z steveebersole $
2
package org.hibernate.transaction;
4
import javax.transaction.Status;
5
import javax.transaction.Synchronization;
6
import javax.transaction.SystemException;
7
import javax.transaction.Transaction;
9
import org.apache.commons.logging.Log;
10
import org.apache.commons.logging.LogFactory;
11
import org.hibernate.TransactionException;
12
import org.hibernate.jdbc.JDBCContext;
13
import org.hibernate.util.JTAHelper;
18
public final class CacheSynchronization implements Synchronization {
20
private static final Log log = LogFactory.getLog(CacheSynchronization.class);
22
private final TransactionFactory.Context ctx;
23
private JDBCContext jdbcContext;
24
private final Transaction transaction;
25
private final org.hibernate.Transaction hibernateTransaction;
27
public CacheSynchronization(
28
TransactionFactory.Context ctx,
29
JDBCContext jdbcContext,
30
Transaction transaction,
31
org.hibernate.Transaction tx
34
this.jdbcContext = jdbcContext;
35
this.transaction = transaction;
36
this.hibernateTransaction = tx;
39
public void beforeCompletion() {
40
log.trace("transaction before completion callback");
44
flush = !ctx.isFlushModeNever() &&
45
ctx.isFlushBeforeCompletionEnabled() &&
46
!JTAHelper.isRollback( transaction.getStatus() );
47
//actually, this last test is probably unnecessary, since
48
//beforeCompletion() doesn't get called during rollback
50
catch (SystemException se) {
51
log.error("could not determine transaction status", se);
53
throw new TransactionException("could not determine transaction status in beforeCompletion()", se);
58
log.trace("automatically flushing session");
62
catch (RuntimeException re) {
67
jdbcContext.beforeTransactionCompletion(hibernateTransaction);
71
private void setRollbackOnly() {
73
transaction.setRollbackOnly();
75
catch (SystemException se) {
76
log.error("could not set transaction to rollback only", se);
80
public void afterCompletion(int status) {
81
if ( log.isTraceEnabled() ) {
82
log.trace("transaction after completion callback, status: " + status);
85
jdbcContext.afterTransactionCompletion(status==Status.STATUS_COMMITTED, hibernateTransaction);
88
if ( ctx.shouldAutoClose() && !ctx.isClosed() ) {
89
log.trace("automatically closing session");
95
public String toString() {
96
return CacheSynchronization.class.getName();