01: //$Id: CacheSynchronization.java 9239 2006-02-08 22:34:34Z steveebersole $
02: package org.hibernate.transaction;
03:
04: import javax.transaction.Status;
05: import javax.transaction.Synchronization;
06: import javax.transaction.SystemException;
07: import javax.transaction.Transaction;
08:
09: 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;
14:
15: /**
16: * @author Gavin King
17: */
18: public final class CacheSynchronization implements Synchronization {
19:
20: private static final Log log = LogFactory
21: .getLog(CacheSynchronization.class);
22:
23: private final TransactionFactory.Context ctx;
24: private JDBCContext jdbcContext;
25: private final Transaction transaction;
26: private final org.hibernate.Transaction hibernateTransaction;
27:
28: public CacheSynchronization(TransactionFactory.Context ctx,
29: JDBCContext jdbcContext, Transaction transaction,
30: org.hibernate.Transaction tx) {
31: this .ctx = ctx;
32: this .jdbcContext = jdbcContext;
33: this .transaction = transaction;
34: this .hibernateTransaction = tx;
35: }
36:
37: public void beforeCompletion() {
38: log.trace("transaction before completion callback");
39:
40: boolean flush;
41: try {
42: flush = !ctx.isFlushModeNever()
43: && ctx.isFlushBeforeCompletionEnabled()
44: && !JTAHelper.isRollback(transaction.getStatus());
45: //actually, this last test is probably unnecessary, since
46: //beforeCompletion() doesn't get called during rollback
47: } catch (SystemException se) {
48: log.error("could not determine transaction status", se);
49: setRollbackOnly();
50: throw new TransactionException(
51: "could not determine transaction status in beforeCompletion()",
52: se);
53: }
54:
55: try {
56: if (flush) {
57: log.trace("automatically flushing session");
58: ctx.managedFlush();
59: }
60: } catch (RuntimeException re) {
61: setRollbackOnly();
62: throw re;
63: } finally {
64: jdbcContext
65: .beforeTransactionCompletion(hibernateTransaction);
66: }
67: }
68:
69: private void setRollbackOnly() {
70: try {
71: transaction.setRollbackOnly();
72: } catch (SystemException se) {
73: log.error("could not set transaction to rollback only", se);
74: }
75: }
76:
77: public void afterCompletion(int status) {
78: if (log.isTraceEnabled()) {
79: log.trace("transaction after completion callback, status: "
80: + status);
81: }
82: try {
83: jdbcContext.afterTransactionCompletion(
84: status == Status.STATUS_COMMITTED,
85: hibernateTransaction);
86: } finally {
87: if (ctx.shouldAutoClose() && !ctx.isClosed()) {
88: log.trace("automatically closing session");
89: ctx.managedClose();
90: }
91: }
92: }
93:
94: public String toString() {
95: return CacheSynchronization.class.getName();
96: }
97:
98: }
|