1 16 17 package org.springframework.orm.hibernate.support; 18 19 import java.io.ByteArrayInputStream ; 20 import java.io.ByteArrayOutputStream ; 21 import java.io.IOException ; 22 import java.io.InputStream ; 23 import java.io.ObjectInputStream ; 24 import java.io.ObjectOutputStream ; 25 import java.io.Serializable ; 26 import java.sql.PreparedStatement ; 27 import java.sql.ResultSet ; 28 import java.sql.SQLException ; 29 import java.sql.Types ; 30 31 import javax.transaction.TransactionManager ; 32 33 import net.sf.hibernate.HibernateException; 34 35 import org.springframework.jdbc.support.lob.LobCreator; 36 import org.springframework.jdbc.support.lob.LobHandler; 37 38 51 public class BlobSerializableType extends AbstractLobType { 52 53 59 private static final int OUTPUT_BYTE_ARRAY_INITIAL_SIZE = 1024; 60 61 67 public BlobSerializableType() { 68 super(); 69 } 70 71 75 protected BlobSerializableType(LobHandler lobHandler, TransactionManager jtaTransactionManager) { 76 super(lobHandler, jtaTransactionManager); 77 } 78 79 public int[] sqlTypes() { 80 return new int[] {Types.BLOB}; 81 } 82 83 public Class returnedClass() { 84 return Serializable .class; 85 } 86 87 public boolean isMutable() { 88 return true; 89 } 90 91 public Object deepCopy(Object value) throws HibernateException { 92 try { 93 ByteArrayOutputStream baos = new ByteArrayOutputStream (OUTPUT_BYTE_ARRAY_INITIAL_SIZE); 95 ObjectOutputStream oos = new ObjectOutputStream (baos); 96 try { 97 oos.writeObject(value); 98 } 99 finally { 100 oos.close(); 101 } 102 103 ByteArrayInputStream bais = new ByteArrayInputStream (baos.toByteArray()); 105 ObjectInputStream ois = new ObjectInputStream (bais); 106 try { 107 return ois.readObject(); 108 } 109 finally { 110 ois.close(); 111 } 112 } 113 catch (ClassNotFoundException ex) { 114 throw new HibernateException("Couldn't clone BLOB contents", ex); 115 } 116 catch (IOException ex) { 117 throw new HibernateException("Couldn't clone BLOB contents", ex); 118 } 119 } 120 121 protected Object nullSafeGetInternal(ResultSet rs, int index, LobHandler lobHandler) 122 throws SQLException , IOException , HibernateException { 123 124 InputStream is = lobHandler.getBlobAsBinaryStream(rs, index); 125 if (is != null) { 126 ObjectInputStream ois = new ObjectInputStream (is); 127 try { 128 return ois.readObject(); 129 } 130 catch (ClassNotFoundException ex) { 131 throw new HibernateException("Could not deserialize BLOB contents", ex); 132 } 133 finally { 134 ois.close(); 135 } 136 } 137 else { 138 return null; 139 } 140 } 141 142 protected void nullSafeSetInternal(PreparedStatement ps, int index, Object value, LobCreator lobCreator) 143 throws SQLException , IOException { 144 145 if (value != null) { 146 ByteArrayOutputStream baos = new ByteArrayOutputStream (OUTPUT_BYTE_ARRAY_INITIAL_SIZE); 147 ObjectOutputStream oos = new ObjectOutputStream (baos); 148 try { 149 oos.writeObject(value); 150 oos.flush(); 151 lobCreator.setBlobAsBytes(ps, index, baos.toByteArray()); 152 } 153 finally { 154 oos.close(); 155 } 156 } 157 else { 158 lobCreator.setBlobAsBytes(ps, index, null); 159 } 160 } 161 162 } 163 | Popular Tags |