1 16 17 package org.springframework.orm.hibernate.support; 18 19 import java.io.IOException ; 20 import java.sql.PreparedStatement ; 21 import java.sql.ResultSet ; 22 import java.sql.SQLException ; 23 24 import javax.transaction.Status ; 25 import javax.transaction.TransactionManager ; 26 27 import net.sf.hibernate.HibernateException; 28 import net.sf.hibernate.UserType; 29 import net.sf.hibernate.util.EqualsHelper; 30 import org.apache.commons.logging.Log; 31 import org.apache.commons.logging.LogFactory; 32 33 import org.springframework.dao.DataAccessResourceFailureException; 34 import org.springframework.jdbc.support.lob.JtaLobCreatorSynchronization; 35 import org.springframework.jdbc.support.lob.LobCreator; 36 import org.springframework.jdbc.support.lob.LobHandler; 37 import org.springframework.jdbc.support.lob.SpringLobCreatorSynchronization; 38 import org.springframework.jdbc.support.lob.LobCreatorUtils; 39 import org.springframework.orm.hibernate.LocalSessionFactoryBean; 40 import org.springframework.orm.hibernate.SessionFactoryUtils; 41 import org.springframework.transaction.support.TransactionSynchronizationManager; 42 43 61 public abstract class AbstractLobType implements UserType { 62 63 69 public static final int LOB_CREATOR_SYNCHRONIZATION_ORDER = 70 SessionFactoryUtils.SESSION_SYNCHRONIZATION_ORDER - 100; 71 72 protected final Log logger = LogFactory.getLog(getClass()); 73 74 private final LobHandler lobHandler; 75 76 private final TransactionManager jtaTransactionManager; 77 78 79 85 protected AbstractLobType() { 86 this(LocalSessionFactoryBean.getConfigTimeLobHandler(), 87 LocalSessionFactoryBean.getConfigTimeTransactionManager()); 88 } 89 90 94 protected AbstractLobType(LobHandler lobHandler, TransactionManager jtaTransactionManager) { 95 this.lobHandler = lobHandler; 96 this.jtaTransactionManager = jtaTransactionManager; 97 } 98 99 100 103 public boolean isMutable() { 104 return false; 105 } 106 107 111 public boolean equals(Object x, Object y) throws HibernateException { 112 return EqualsHelper.equals(x, y); 113 } 114 115 118 public Object deepCopy(Object value) throws HibernateException { 119 return value; 120 } 121 122 123 128 public final Object nullSafeGet(ResultSet rs, String [] names, Object owner) 129 throws HibernateException, SQLException { 130 131 if (this.lobHandler == null) { 132 throw new IllegalStateException ("No LobHandler found for configuration - " + 133 "lobHandler property must be set on LocalSessionFactoryBean"); 134 } 135 136 try { 137 return nullSafeGetInternal(rs, rs.findColumn(names[0]), this.lobHandler); 138 } 139 catch (IOException ex) { 140 throw new HibernateException("I/O errors during LOB access", ex); 141 } 142 } 143 144 150 public final void nullSafeSet(PreparedStatement st, Object value, int index) 151 throws HibernateException, SQLException { 152 153 if (this.lobHandler == null) { 154 throw new IllegalStateException ("No LobHandler found for configuration - " + 155 "lobHandler property must be set on LocalSessionFactoryBean"); 156 } 157 158 LobCreator lobCreator = this.lobHandler.getLobCreator(); 159 try { 160 nullSafeSetInternal(st, index, value, lobCreator); 161 } 162 catch (IOException ex) { 163 throw new HibernateException("I/O errors during LOB access", ex); 164 } 165 LobCreatorUtils.registerTransactionSynchronization(lobCreator, this.jtaTransactionManager); 166 } 167 168 178 protected abstract Object nullSafeGetInternal(ResultSet rs, int index, LobHandler lobHandler) 179 throws SQLException , IOException , HibernateException; 180 181 191 protected abstract void nullSafeSetInternal( 192 PreparedStatement ps, int index, Object value, LobCreator lobCreator) 193 throws SQLException , IOException , HibernateException; 194 195 } 196 | Popular Tags |