[hibernate-commits] Hibernate SVN: r19297 - in core/branches/Branch_3_3_2_GA_CP: core/src/main/java/org/hibernate/dialect and 10 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Apr 27 01:46:06 EDT 2010


Author: stliu
Date: 2010-04-27 01:46:04 -0400 (Tue, 27 Apr 2010)
New Revision: 19297

Added:
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongBinaryType.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongStringType.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/ImageType.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedBlobType.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedClobType.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobLocatorTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobLocatorTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/ImageHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/TextHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java
Removed:
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobTest.java
Modified:
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/Hibernate.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/DB2Dialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Dialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/HSQLDialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQL5Dialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQLDialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TextType.java
   core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TypeFactory.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobHolder.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobMappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml
   core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java
Log:
JBPAPP-2860 HHH-3892 - Improve support for mapping SQL LONGVARCHAR and CLOB to Java String, SQL LONGVARBINARY and BLOB to Java byte[]

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/Hibernate.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/Hibernate.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/Hibernate.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -61,10 +61,13 @@
 import org.hibernate.type.DateType;
 import org.hibernate.type.DoubleType;
 import org.hibernate.type.FloatType;
+import org.hibernate.type.ImageType;
 import org.hibernate.type.IntegerType;
 import org.hibernate.type.LocaleType;
 import org.hibernate.type.LongType;
 import org.hibernate.type.ManyToOneType;
+import org.hibernate.type.MaterializedBlobType;
+import org.hibernate.type.MaterializedClobType;
 import org.hibernate.type.NullableType;
 import org.hibernate.type.SerializableType;
 import org.hibernate.type.ShortType;
@@ -178,10 +181,23 @@
 	 */
 	public static final NullableType CHARACTER_ARRAY = new CharacterArrayType();
 	/**
+	 * Hibernate <tt>image</tt> type.
+	 */
+	public static final NullableType IMAGE = new ImageType();
+	/**
 	 * Hibernate <tt>text</tt> type.
 	 */
 	public static final NullableType TEXT = new TextType();
 	/**
+	 * Hibernate <tt>materialized_blob</tt> type.
+	 */
+	public static final NullableType MATERIALIZED_BLOB = new MaterializedBlobType();
+	/**
+	 * Hibernate <tt>materialized_clob</tt> type.
+	 */
+	public static final NullableType MATERIALIZED_CLOB = new MaterializedClobType();
+
+	/**
 	 * Hibernate <tt>blob</tt> type.
 	 */
 	public static final Type BLOB = new BlobType();

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/DB2Dialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/DB2Dialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/DB2Dialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -61,6 +61,8 @@
 		registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
 		registerColumnType( Types.BLOB, "blob($l)" );
 		registerColumnType( Types.CLOB, "clob($l)" );
+		registerColumnType( Types.LONGVARCHAR, "long varchar" );
+		registerColumnType( Types.LONGVARBINARY, "long varchar for bit data" );
 
 		registerFunction("abs", new StandardSQLFunction("abs") );
 		registerFunction("absval", new StandardSQLFunction("absval") );

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Dialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Dialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Dialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -216,6 +216,8 @@
 		registerHibernateType( Types.TIMESTAMP, Hibernate.TIMESTAMP.getName() );
 		registerHibernateType( Types.VARCHAR, Hibernate.STRING.getName() );
 		registerHibernateType( Types.VARBINARY, Hibernate.BINARY.getName() );
+		registerHibernateType( Types.LONGVARCHAR, Hibernate.TEXT.getName() );
+		registerHibernateType( Types.LONGVARBINARY, Hibernate.IMAGE.getName() );
 		registerHibernateType( Types.NUMERIC, Hibernate.BIG_DECIMAL.getName() );
 		registerHibernateType( Types.DECIMAL, Hibernate.BIG_DECIMAL.getName() );
 		registerHibernateType( Types.BLOB, Hibernate.BLOB.getName() );

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/HSQLDialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/HSQLDialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/HSQLDialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -81,6 +81,8 @@
 		//HSQL has no Blob/Clob support .... but just put these here for now!
 		registerColumnType( Types.BLOB, "longvarbinary" );
 		registerColumnType( Types.CLOB, "longvarchar" );
+		registerColumnType( Types.LONGVARBINARY, "longvarbinary" );
+		registerColumnType( Types.LONGVARCHAR, "longvarchar" );
 
 		registerFunction( "ascii", new StandardSQLFunction( "ascii", Hibernate.INTEGER ) );
 		registerFunction( "char", new StandardSQLFunction( "char", Hibernate.CHARACTER ) );

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQL5Dialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQL5Dialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQL5Dialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -36,5 +36,6 @@
 		registerColumnType( Types.VARCHAR, "longtext" );
 //		registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );
 		registerColumnType( Types.VARCHAR, 65535, "varchar($l)" );
+		registerColumnType( Types.LONGVARCHAR, "longtext" );
 	}
 }

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQLDialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQLDialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/MySQLDialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -59,6 +59,8 @@
 		registerColumnType( Types.VARBINARY, 16777215, "mediumblob" );
 		registerColumnType( Types.VARBINARY, 65535, "blob" );
 		registerColumnType( Types.VARBINARY, 255, "tinyblob" );
+		registerColumnType( Types.LONGVARBINARY, "longblob" );
+		registerColumnType( Types.LONGVARBINARY, 16777215, "mediumblob" );
 		registerColumnType( Types.NUMERIC, "decimal($p,$s)" );
 		registerColumnType( Types.BLOB, "longblob" );
 //		registerColumnType( Types.BLOB, 16777215, "mediumblob" );
@@ -181,6 +183,8 @@
 //		registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );
 //		registerColumnType( Types.VARCHAR, 65535, "text" );
 		registerColumnType( Types.VARCHAR, 255, "varchar($l)" );
+		registerColumnType( Types.LONGVARCHAR, "longtext" );
+
 	}
 
 	public String getAddColumnString() {

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -98,6 +98,9 @@
 
 		registerColumnType( Types.BLOB, "blob" );
 		registerColumnType( Types.CLOB, "clob" );
+
+		registerColumnType( Types.LONGVARCHAR, "long" );
+		registerColumnType( Types.LONGVARBINARY, "long raw" );	
 	}
 
 	protected void registerReverseHibernateTypeMappings() {

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -62,6 +62,8 @@
 		registerColumnType( Types.TIME, "time" );
 		registerColumnType( Types.TIMESTAMP, "timestamp" );
 		registerColumnType( Types.VARBINARY, "bytea" );
+		registerColumnType( Types.LONGVARCHAR, "text" );
+		registerColumnType( Types.LONGVARBINARY, "bytea" );
 		registerColumnType( Types.CLOB, "text" );
 		registerColumnType( Types.BLOB, "oid" );
 		registerColumnType( Types.NUMERIC, "numeric($p, $s)" );

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -42,7 +42,8 @@
 	public SQLServerDialect() {
 		registerColumnType( Types.VARBINARY, "image" );
 		registerColumnType( Types.VARBINARY, 8000, "varbinary($l)" );
-
+		registerColumnType( Types.LONGVARBINARY, "image" );
+		registerColumnType( Types.LONGVARCHAR, "text" );
 		registerFunction( "second", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(second, ?1)" ) );
 		registerFunction( "minute", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(minute, ?1)" ) );
 		registerFunction( "hour", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(hour, ?1)" ) );

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -25,6 +25,8 @@
  */
 package org.hibernate.dialect;
 
+import java.sql.Types;
+
 import org.hibernate.Hibernate;
 import org.hibernate.dialect.function.AnsiTrimEmulationFunction;
 import org.hibernate.dialect.function.SQLFunctionTemplate;
@@ -37,6 +39,8 @@
 public class SybaseASE15Dialect extends AbstractTransactSQLDialect {
 	public SybaseASE15Dialect() {
 		super();
+		registerColumnType( Types.LONGVARBINARY, "image" );
+		registerColumnType( Types.LONGVARCHAR, "text" );
 		registerFunction( "second", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(second, ?1)") );
 		registerFunction( "minute", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(minute, ?1)") );
 		registerFunction( "hour", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(hour, ?1)") );

Added: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongBinaryType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongBinaryType.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongBinaryType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,46 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.type;
+
+/**
+ * An abstract type for mapping long binary SQL types to Java byte[].
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractLongBinaryType extends AbstractBynaryType {
+
+	public Class getReturnedClass() {
+		return byte[].class;
+	}
+
+	protected Object toExternalFormat(byte[] bytes) {
+		return bytes;
+	}
+
+	protected byte[] toInternalFormat(Object bytes) {
+		return ( byte[] ) bytes;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongStringType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongStringType.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/AbstractLongStringType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,94 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.type;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.hibernate.HibernateException;
+
+/**
+ * An abstract type for mapping long string SQL types to a Java String.
+ * @author Gavin King, Bertrand Renuart (from TextType)
+ */
+public abstract class AbstractLongStringType extends ImmutableType {
+
+	public void set(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+		String str = (String) value;
+		st.setCharacterStream( index, new StringReader(str), str.length() );
+	}
+
+	public Object get(ResultSet rs, String name) throws HibernateException, SQLException {
+
+			// Retrieve the value of the designated column in the current row of this
+			// ResultSet object as a java.io.Reader object
+			Reader charReader = rs.getCharacterStream(name);
+
+			// if the corresponding SQL value is NULL, the reader we got is NULL as well
+			if (charReader==null) return null;
+
+			// Fetch Reader content up to the end - and put characters in a StringBuffer
+			StringBuffer sb = new StringBuffer();
+			try {
+				char[] buffer = new char[2048];
+				while (true) {
+					int amountRead = charReader.read(buffer, 0, buffer.length);
+					if ( amountRead == -1 ) break;
+					sb.append(buffer, 0, amountRead);
+				}
+			}
+			catch (IOException ioe) {
+				throw new HibernateException( "IOException occurred reading text", ioe );
+			}
+			finally {
+				try {
+					charReader.close();
+				}
+				catch (IOException e) {
+					throw new HibernateException( "IOException occurred closing stream", e );
+				}
+			}
+
+			// Return StringBuffer content as a large String
+			return sb.toString();
+	}
+
+	public Class getReturnedClass() {
+		return String.class;
+	}
+
+	public String toString(Object val) {
+		return (String) val;
+	}
+	public Object fromStringValue(String xml) {
+		return xml;
+	}
+
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/ImageType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/ImageType.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/ImageType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,44 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.type;
+
+import java.sql.Types;
+
+/**
+ * <tt>image</tt>: A type that maps an SQL LONGVARBINARY to Java byte[].
+ *
+ * @author Gail Badner
+ */
+public class ImageType extends AbstractLongBinaryType {
+
+	public int sqlType() {
+		return Types.LONGVARBINARY;
+	}
+
+	public String getName() {
+		return "image";
+	}
+}

Added: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedBlobType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedBlobType.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedBlobType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,44 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.type;
+
+import java.sql.Types;
+
+/**
+ * <tt>materialized_blob</tt>: A type that maps an SQL BLOB to Java byte[].
+ *
+ * @author Gail Badner
+ */
+public class MaterializedBlobType extends AbstractLongBinaryType {
+
+	public int sqlType() {
+		return Types.BLOB;
+	}
+
+	public String getName() {
+		return "materialized_blob";
+	}
+}

Added: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedClobType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedClobType.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/MaterializedClobType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,42 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.type;
+
+import java.sql.Types;
+
+/**
+ * <tt>materialized_clob</tt>: A type that maps an SQL CLOB to a Java String.
+ *
+ * @author Gail Badner
+ */
+public class MaterializedClobType extends AbstractLongStringType {
+
+	public int sqlType() {
+		return Types.CLOB;
+	}
+
+	public String getName() { return "materialized_clob"; }
+}
\ No newline at end of file

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TextType.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TextType.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TextType.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -1,3 +1,4 @@
+//$Id: $
 /*
  * Hibernate, Relational Persistence for Idiomatic Java
  *
@@ -24,79 +25,21 @@
  */
 package org.hibernate.type;
 
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.sql.Types;
 
-import org.hibernate.HibernateException;
-
 /**
- * <tt>text</tt>: A type that maps an SQL CLOB to a Java String.
+ * <tt>text</tt>: A type that maps an SQL LONGVARCHAR to a Java String.
+ *
  * @author Gavin King, Bertrand Renuart
  */
-public class TextType extends ImmutableType {
+public class TextType extends AbstractLongStringType {
 
-	public void set(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
-		String str = (String) value;
-		st.setCharacterStream( index, new StringReader(str), str.length() );
-	}
-
-	public Object get(ResultSet rs, String name) throws HibernateException, SQLException {
-
-			// Retrieve the value of the designated column in the current row of this
-			// ResultSet object as a java.io.Reader object
-			Reader charReader = rs.getCharacterStream(name);
-
-			// if the corresponding SQL value is NULL, the reader we got is NULL as well
-			if (charReader==null) return null;
-
-			// Fetch Reader content up to the end - and put characters in a StringBuffer
-			StringBuffer sb = new StringBuffer();
-			try {
-				char[] buffer = new char[2048];
-				while (true) {
-					int amountRead = charReader.read(buffer, 0, buffer.length);
-					if ( amountRead == -1 ) break;
-					sb.append(buffer, 0, amountRead);
-				}
-			}
-			catch (IOException ioe) {
-				throw new HibernateException( "IOException occurred reading text", ioe );
-			}
-			finally {
-				try {
-					charReader.close();
-				}
-				catch (IOException e) {
-					throw new HibernateException( "IOException occurred closing stream", e );
-				}
-			}
-
-			// Return StringBuffer content as a large String
-			return sb.toString();
-	}
-
 	public int sqlType() {
-		return Types.CLOB; //or Types.LONGVARCHAR?
+		return Types.LONGVARCHAR;
 	}
 
-	public Class getReturnedClass() {
-		return String.class;
-	}
-
 	public String getName() { return "text"; }
 
-	public String toString(Object val) {
-		return (String) val;
-	}
-	public Object fromStringValue(String xml) {
-		return xml;
-	}
-
 }
 
 

Modified: core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TypeFactory.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TypeFactory.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/core/src/main/java/org/hibernate/type/TypeFactory.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -90,7 +90,10 @@
 		basics.put( Hibernate.TRUE_FALSE.getName(), Hibernate.TRUE_FALSE );
 		basics.put( Hibernate.YES_NO.getName(), Hibernate.YES_NO );
 		basics.put( Hibernate.BINARY.getName(), Hibernate.BINARY );
+		basics.put( Hibernate.IMAGE.getName(), Hibernate.IMAGE );
 		basics.put( Hibernate.TEXT.getName(), Hibernate.TEXT );
+		basics.put( Hibernate.MATERIALIZED_BLOB.getName(), Hibernate.MATERIALIZED_BLOB );
+		basics.put( Hibernate.MATERIALIZED_CLOB.getName(), Hibernate.MATERIALIZED_CLOB );
 		basics.put( Hibernate.BLOB.getName(), Hibernate.BLOB );
 		basics.put( Hibernate.CLOB.getName(), Hibernate.CLOB );
 		basics.put( Hibernate.BIG_DECIMAL.getName(), Hibernate.BIG_DECIMAL );

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobLocatorTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobLocatorTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobLocatorTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,196 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import java.sql.Blob;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Tests lazy materialization of data mapped by
+ * {@link org.hibernate.type.BlobType}, as well as bounded and unbounded
+ * materialization and mutation.
+ *
+ * @author Steve Ebersole
+ */
+public class BlobLocatorTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int BLOB_SIZE = 10000;
+
+	public BlobLocatorTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/LobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BlobLocatorTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	public void testBoundedBlobLocatorAccess() throws Throwable {
+		byte[] original = buildRecursively( BLOB_SIZE, true );
+		byte[] changed = buildRecursively( BLOB_SIZE, false );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setBlobLocator( Hibernate.createBlob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// test mutation via setting the new clob data...
+		if ( supportsLobValueChangePropogation() ) {
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			entity.getBlobLocator().truncate( 1 );
+			entity.getBlobLocator().setBytes( 1, changed );
+			s.getTransaction().commit();
+			s.close();
+
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			assertNotNull( entity.getBlobLocator() );
+			assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+			assertEquals( changed, extractData( entity.getBlobLocator() ) );
+			entity.getBlobLocator().truncate( 1 );
+			entity.getBlobLocator().setBytes( 1, original );
+			s.getTransaction().commit();
+			s.close();
+		}
+
+		// test mutation via supplying a new clob locator instance...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+		assertNotNull( entity.getBlobLocator() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+		entity.setBlobLocator( Hibernate.createBlob( changed ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( changed, extractData( entity.getBlobLocator() ) );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testUnboundedBlobLocatorAccess() throws Throwable {
+		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
+			return;
+		}
+
+		// Note: unbounded mutation of the underlying lob data is completely
+		// unsupported; most databases would not allow such a construct anyway.
+		// Thus here we are only testing materialization...
+
+		byte[] original = buildRecursively( BLOB_SIZE, true );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setBlobLocator( Hibernate.createBlob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		// load the entity with the clob locator, and close the session/transaction;
+		// at that point it is unbounded...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private byte[] extractData(Blob blob) throws Throwable {
+		return blob.getBytes( 1, ( int ) blob.length() );
+	}
+
+
+	private byte[] buildRecursively(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
+	public static void assertEquals(byte[] val1, byte[] val2) {
+		if ( !ArrayHelper.isEquals( val1, val2 ) ) {
+			throw new AssertionFailedError( "byte arrays did not match" );
+		}
+	}
+}

Deleted: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobTest.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/BlobTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -1,200 +0,0 @@
-package org.hibernate.test.lob;
-
-import java.sql.Blob;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-
-import org.hibernate.Hibernate;
-import org.hibernate.LockMode;
-import org.hibernate.Session;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-import org.hibernate.util.ArrayHelper;
-
-/**
- * {@inheritDoc}
- *
- * @author Steve Ebersole
- */
-public class BlobTest extends DatabaseSpecificFunctionalTestCase {
-	private static final int BLOB_SIZE = 10000;
-
-	public BlobTest(String name) {
-		super( name );
-	}
-
-	public String[] getMappings() {
-		return new String[] { "lob/LobMappings.hbm.xml" };
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( BlobTest.class );
-	}
-
-	public boolean appliesTo(Dialect dialect) {
-		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
-			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
-			return false;
-		}
-		return true;
-	}
-
-	public void testBoundedMaterializedBlobAccess() {
-		byte[] original = buildRecursively( BLOB_SIZE, true );
-		byte[] changed = buildRecursively( BLOB_SIZE, false );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setMaterializedBlob( original );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( BLOB_SIZE, entity.getMaterializedBlob().length );
-		assertEquals( original, entity.getMaterializedBlob() );
-		entity.setMaterializedBlob( changed );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( BLOB_SIZE, entity.getMaterializedBlob().length );
-		assertEquals( changed, entity.getMaterializedBlob() );
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-	}
-
-	public void testBoundedBlobLocatorAccess() throws Throwable {
-		byte[] original = buildRecursively( BLOB_SIZE, true );
-		byte[] changed = buildRecursively( BLOB_SIZE, false );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setBlobLocator( Hibernate.createBlob( original ) );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
-		assertEquals( original, extractData( entity.getBlobLocator() ) );
-		s.getTransaction().commit();
-		s.close();
-
-		// test mutation via setting the new clob data...
-		if ( supportsLobValueChangePropogation() ) {
-			s = openSession();
-			s.beginTransaction();
-			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-			entity.getBlobLocator().truncate( 1 );
-			entity.getBlobLocator().setBytes( 1, changed );
-			s.getTransaction().commit();
-			s.close();
-
-			s = openSession();
-			s.beginTransaction();
-			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-			assertNotNull( entity.getBlobLocator() );
-			assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
-			assertEquals( changed, extractData( entity.getBlobLocator() ) );
-			entity.getBlobLocator().truncate( 1 );
-			entity.getBlobLocator().setBytes( 1, original );
-			s.getTransaction().commit();
-			s.close();
-		}
-
-		// test mutation via supplying a new clob locator instance...
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-		assertNotNull( entity.getBlobLocator() );
-		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
-		assertEquals( original, extractData( entity.getBlobLocator() ) );
-		entity.setBlobLocator( Hibernate.createBlob( changed ) );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
-		assertEquals( changed, extractData( entity.getBlobLocator() ) );
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-
-	}
-
-	public void testUnboundedBlobLocatorAccess() throws Throwable {
-		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
-			return;
-		}
-
-		// Note: unbounded mutation of the underlying lob data is completely
-		// unsupported; most databases would not allow such a construct anyway.
-		// Thus here we are only testing materialization...
-
-		byte[] original = buildRecursively( BLOB_SIZE, true );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setBlobLocator( Hibernate.createBlob( original ) );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		// load the entity with the clob locator, and close the session/transaction;
-		// at that point it is unbounded...
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		s.getTransaction().commit();
-		s.close();
-
-		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
-		assertEquals( original, extractData( entity.getBlobLocator() ) );
-
-		s = openSession();
-		s.beginTransaction();
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-	}
-
-	private byte[] extractData(Blob blob) throws Throwable {
-		return blob.getBytes( 1, ( int ) blob.length() );
-	}
-
-
-	private byte[] buildRecursively(int size, boolean on) {
-		byte[] data = new byte[size];
-		data[0] = mask( on );
-		for ( int i = 0; i < size; i++ ) {
-			data[i] = mask( on );
-			on = !on;
-		}
-		return data;
-	}
-
-	private byte mask(boolean on) {
-		return on ? ( byte ) 1 : ( byte ) 0;
-	}
-
-	public static void assertEquals(byte[] val1, byte[] val2) {
-		if ( !ArrayHelper.isEquals( val1, val2 ) ) {
-			throw new AssertionFailedError( "byte arrays did not match" );
-		}
-	}
-}

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobLocatorTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobLocatorTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobLocatorTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,190 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import java.sql.Clob;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests lazy materialization of data mapped by
+ * {@link org.hibernate.type.ClobType} as well as bounded and unbounded
+ * materialization and mutation.
+ *
+ * @author Steve Ebersole
+ */
+public class ClobLocatorTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int CLOB_SIZE = 10000;
+
+	public ClobLocatorTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/LobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ClobLocatorTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	public void testBoundedClobLocatorAccess() throws Throwable {
+		String original = buildRecursively( CLOB_SIZE, 'x' );
+		String changed = buildRecursively( CLOB_SIZE, 'y' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setClobLocator( Hibernate.createClob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// test mutation via setting the new clob data...
+		if ( supportsLobValueChangePropogation() ) {
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			entity.getClobLocator().truncate( 1 );
+			entity.getClobLocator().setString( 1, changed );
+			s.getTransaction().commit();
+			s.close();
+
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			assertNotNull( entity.getClobLocator() );
+			assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+			assertEquals( changed, extractData( entity.getClobLocator() ) );
+			entity.getClobLocator().truncate( 1 );
+			entity.getClobLocator().setString( 1, original );
+			s.getTransaction().commit();
+			s.close();
+		}
+
+		// test mutation via supplying a new clob locator instance...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+		assertNotNull( entity.getClobLocator() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+		entity.setClobLocator( Hibernate.createClob( changed ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( changed, extractData( entity.getClobLocator() ) );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testUnboundedClobLocatorAccess() throws Throwable {
+		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
+			return;
+		}
+
+		// Note: unbounded mutation of the underlying lob data is completely
+		// unsupported; most databases would not allow such a construct anyway.
+		// Thus here we are only testing materialization...
+
+		String original = buildRecursively( CLOB_SIZE, 'x' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setClobLocator( Hibernate.createClob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		// load the entity with the clob locator, and close the session/transaction;
+		// at that point it is unbounded...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private String extractData(Clob clob) throws Throwable {
+		if ( getDialect() instanceof H2Dialect ) {
+			return clob.getSubString( 1, ( int ) clob.length() );
+		}
+		else {
+			char[] data = new char[ (int) clob.length() ];
+			clob.getCharacterStream().read( data );
+			return new String( data );
+		}
+	}
+
+
+	private String buildRecursively(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+}

Deleted: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobTest.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ClobTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -1,196 +0,0 @@
-package org.hibernate.test.lob;
-
-import java.sql.Clob;
-
-import junit.framework.Test;
-
-import org.hibernate.Hibernate;
-import org.hibernate.LockMode;
-import org.hibernate.Session;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.dialect.H2Dialect;
-import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
-import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
-
-/**
- * Test various access scenarios for eager and lazy materialization
- * of CLOB data, as well as bounded and unbounded materialization
- * and mutation.
- *
- * @author Steve Ebersole
- */
-public class ClobTest extends DatabaseSpecificFunctionalTestCase {
-	private static final int CLOB_SIZE = 10000;
-
-	public ClobTest(String name) {
-		super( name );
-	}
-
-	public String[] getMappings() {
-		return new String[] { "lob/LobMappings.hbm.xml" };
-	}
-
-	public static Test suite() {
-		return new FunctionalTestClassTestSuite( ClobTest.class );
-	}
-
-	public boolean appliesTo(Dialect dialect) {
-		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
-			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
-			return false;
-		}
-		return true;
-	}
-
-	public void testBoundedMaterializedClobAccess() {
-		String original = buildRecursively( CLOB_SIZE, 'x' );
-		String changed = buildRecursively( CLOB_SIZE, 'y' );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setMaterializedClob( original );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( CLOB_SIZE, entity.getMaterializedClob().length() );
-		assertEquals( original, entity.getMaterializedClob() );
-		entity.setMaterializedClob( changed );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( CLOB_SIZE, entity.getMaterializedClob().length() );
-		assertEquals( changed, entity.getMaterializedClob() );
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-	}
-
-	public void testBoundedClobLocatorAccess() throws Throwable {
-		String original = buildRecursively( CLOB_SIZE, 'x' );
-		String changed = buildRecursively( CLOB_SIZE, 'y' );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setClobLocator( Hibernate.createClob( original ) );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
-		assertEquals( original, extractData( entity.getClobLocator() ) );
-		s.getTransaction().commit();
-		s.close();
-
-		// test mutation via setting the new clob data...
-		if ( supportsLobValueChangePropogation() ) {
-			s = openSession();
-			s.beginTransaction();
-			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-			entity.getClobLocator().truncate( 1 );
-			entity.getClobLocator().setString( 1, changed );
-			s.getTransaction().commit();
-			s.close();
-
-			s = openSession();
-			s.beginTransaction();
-			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-			assertNotNull( entity.getClobLocator() );
-			assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
-			assertEquals( changed, extractData( entity.getClobLocator() ) );
-			entity.getClobLocator().truncate( 1 );
-			entity.getClobLocator().setString( 1, original );
-			s.getTransaction().commit();
-			s.close();
-		}
-
-		// test mutation via supplying a new clob locator instance...
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
-		assertNotNull( entity.getClobLocator() );
-		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
-		assertEquals( original, extractData( entity.getClobLocator() ) );
-		entity.setClobLocator( Hibernate.createClob( changed ) );
-		s.getTransaction().commit();
-		s.close();
-
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
-		assertEquals( changed, extractData( entity.getClobLocator() ) );
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-
-	}
-
-	public void testUnboundedClobLocatorAccess() throws Throwable {
-		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
-			return;
-		}
-
-		// Note: unbounded mutation of the underlying lob data is completely
-		// unsupported; most databases would not allow such a construct anyway.
-		// Thus here we are only testing materialization...
-
-		String original = buildRecursively( CLOB_SIZE, 'x' );
-
-		Session s = openSession();
-		s.beginTransaction();
-		LobHolder entity = new LobHolder();
-		entity.setClobLocator( Hibernate.createClob( original ) );
-		s.save( entity );
-		s.getTransaction().commit();
-		s.close();
-
-		// load the entity with the clob locator, and close the session/transaction;
-		// at that point it is unbounded...
-		s = openSession();
-		s.beginTransaction();
-		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
-		s.getTransaction().commit();
-		s.close();
-
-		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
-		assertEquals( original, extractData( entity.getClobLocator() ) );
-
-		s = openSession();
-		s.beginTransaction();
-		s.delete( entity );
-		s.getTransaction().commit();
-		s.close();
-	}
-
-	private String extractData(Clob clob) throws Throwable {
-		if ( getDialect() instanceof H2Dialect ) {
-			return clob.getSubString( 1, ( int ) clob.length() );
-		}
-		else {
-			char[] data = new char[ (int) clob.length() ];
-			clob.getCharacterStream().read( data );
-			return new String( data );
-		}
-	}
-
-
-	private String buildRecursively(int size, char baseChar) {
-		StringBuffer buff = new StringBuffer();
-		for( int i = 0; i < size; i++ ) {
-			buff.append( baseChar );
-		}
-		return buff.toString();
-	}
-}

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageMappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongByteArrayHolder" table="LOB_ENTITY_IMAGE">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longByteArray" column="LONG_BYTE_ARRAY" type="image" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/ImageTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,51 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.ImageType}.
+ *
+ * @author Gail Badner
+ */
+public class ImageTest extends LongByteArrayTest {
+
+	public ImageTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/ImageMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImageTest.class );
+	}
+}
\ No newline at end of file

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobHolder.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -1,27 +1,15 @@
 package org.hibernate.test.lob;
 
-import java.io.Serializable;
 import java.sql.Blob;
 import java.sql.Clob;
 
 /**
  * An entity containing all kinds of good LOB-type data...
  * <p/>
- * {@link #serialData} is used to hold general serializable data which is
- * mapped via the {@link org.hibernate.type.SerializableType}.
- * <p/>
- * {@link #materializedClob} is used to hold CLOB data that is materialized
- * into a String immediately; it is mapped via the
- * {@link org.hibernate.type.TextType}.
- * <p/>
  * {@link #clobLocator} is used to hold CLOB data that is materialized lazily
  * via a JDBC CLOB locator; it is mapped via the
  * {@link org.hibernate.type.ClobType}
  * <p/>
- * {@link #materializedBlob} is used to hold BLOB data that is materialized
- * into a byte array immediately; it is mapped via the
- * {@link org.hibernate.test.lob.MaterializedBlobType}.
- * <p/>
  * {@link #blobLocator} is used to hold BLOB data that is materialized lazily
  * via a JDBC BLOB locator; it is mapped via the
  * {@link org.hibernate.type.BlobType}
@@ -32,12 +20,8 @@
 public class LobHolder {
 	private Long id;
 
-	private Serializable serialData;
-
-	private String materializedClob;
 	private Clob clobLocator;
 
-	private byte[] materializedBlob;
 	private Blob blobLocator;
 
 	public Long getId() {
@@ -48,22 +32,6 @@
 		this.id = id;
 	}
 
-	public Serializable getSerialData() {
-		return serialData;
-	}
-
-	public void setSerialData(Serializable serialData) {
-		this.serialData = serialData;
-	}
-
-	public String getMaterializedClob() {
-		return materializedClob;
-	}
-
-	public void setMaterializedClob(String materializedClob) {
-		this.materializedClob = materializedClob;
-	}
-
 	public Clob getClobLocator() {
 		return clobLocator;
 	}
@@ -72,14 +40,6 @@
 		this.clobLocator = clobLocator;
 	}
 
-	public byte[] getMaterializedBlob() {
-		return materializedBlob;
-	}
-
-	public void setMaterializedBlob(byte[] materializedBlob) {
-		this.materializedBlob = materializedBlob;
-	}
-
 	public Blob getBlobLocator() {
 		return blobLocator;
 	}

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobMappings.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LobMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -10,13 +10,9 @@
 			<generator class="increment"/>
 		</id>
 
-		<property name="serialData" column="SER_DATA" type="serializable"/>
+        <property name="clobLocator" column="CLOB_DATA" type="clob" length="15000" />
 
-		<property name="materializedClob" column="MAT_CLOB_DATA" type="text" length="15000"/>
-        <property name="clobLocator" column="CLOB_DATA" type="clob" length="15000"/>
-
-		<property name="materializedBlob" column="MAT_BLOB_DATA" type="org.hibernate.test.lob.MaterializedBlobType" length="15000"/>
-        <property name="blobLocator" column="BLOB_DATA" type="blob" length="15000"/>
+        <property name="blobLocator" column="BLOB_DATA" type="blob" length="15000" />
     </class>
 
 </hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayHolder.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,54 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+/**
+ * An entity containing data that is materialized into a byte array immediately.
+ * The hibernate type mapped for {@link #longByteArray} determines the SQL type
+ * asctually used.
+ * 
+ * @author Gail Badner
+ */
+public class LongByteArrayHolder {
+	private Long id;
+	private byte[] longByteArray;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public byte[] getLongByteArray() {
+		return longByteArray;
+	}
+
+	public void setLongByteArray(byte[] longByteArray) {
+		this.longByteArray = longByteArray;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongByteArrayTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,110 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.AssertionFailedError;
+import org.hibernate.Session;
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Tests eager materialization and mutation of long byte arrays.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class LongByteArrayTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int ARRAY_SIZE = 10000;
+
+	public LongByteArrayTest(String name) {
+		super( name );
+	}
+
+	public void testBoundedLongByteArrayAccess() {
+		byte[] original = buildRecursively( ARRAY_SIZE, true );
+		byte[] changed = buildRecursively( ARRAY_SIZE, false );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LongByteArrayHolder entity = new LongByteArrayHolder();
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertNull( entity.getLongByteArray() );
+		entity.setLongByteArray( original );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertEquals( ARRAY_SIZE, entity.getLongByteArray().length );
+		assertEquals( original, entity.getLongByteArray() );
+		entity.setLongByteArray( changed );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertEquals( ARRAY_SIZE, entity.getLongByteArray().length );
+		assertEquals( changed, entity.getLongByteArray() );
+		entity.setLongByteArray( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertNull( entity.getLongByteArray() );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private byte[] buildRecursively(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
+	public static void assertEquals(byte[] val1, byte[] val2) {
+		if ( !ArrayHelper.isEquals( val1, val2 ) ) {
+			throw new AssertionFailedError( "byte arrays did not match" );
+		}
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringHolder.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,53 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+/**
+ * An entity containing data that is materialized into a String immediately.
+ *
+ * @author Gail Badner
+ */
+public class LongStringHolder {
+	private Long id;
+
+	private String longString;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getLongString() {
+		return longString;
+	}
+
+	public void setLongString(String longString) {
+		this.longString = longString;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/LongStringTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,99 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests eager materialization and mutation of long strings.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class LongStringTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int LONG_STRING_SIZE = 10000;
+
+	public LongStringTest(String name) {
+		super( name );
+	}
+
+	public void testBoundedLongStringAccess() {
+		String original = buildRecursively( LONG_STRING_SIZE, 'x' );
+		String changed = buildRecursively( LONG_STRING_SIZE, 'y' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LongStringHolder entity = new LongStringHolder();
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertNull( entity.getLongString() );
+		entity.setLongString( original );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertEquals( LONG_STRING_SIZE, entity.getLongString().length() );
+		assertEquals( original, entity.getLongString() );
+		entity.setLongString( changed );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertEquals( LONG_STRING_SIZE, entity.getLongString().length() );
+		assertEquals( changed, entity.getLongString() );
+		entity.setLongString( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertNull( entity.getLongString() );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private String buildRecursively(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongByteArrayHolder" table="LOB_ENTITY_MAT_BLOB">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+        <property name="longByteArray" column="LONG_BYTE_ARRAY" type="materialized_blob" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedBlobTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,60 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.MaterializedBlobType}.
+ *
+ * @author Gail Badner
+ */
+public class MaterializedBlobTest extends LongByteArrayTest {
+
+	public MaterializedBlobTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/MaterializedBlobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MaterializedBlobTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongStringHolder" table="LOB_ENTITY_MAT_CLOB">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longString" column="LONG_STR" type="materialized_clob" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/MaterializedClobTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,60 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.MaterializedClobType}.
+ *
+ * @author Gail Badner
+ */
+public class MaterializedClobTest extends LongStringTest {
+
+	public MaterializedClobTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/MaterializedClobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MaterializedClobTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableHolder.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,56 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import java.io.Serializable;
+
+/**
+ * An entity containing serializable data which is
+ * mapped via the {@link org.hibernate.type.SerializableType}.
+ *
+ * @author Steve Ebersole
+ */
+public class SerializableHolder {
+	private Long id;
+
+	private Serializable serialData;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Serializable getSerialData() {
+		return serialData;
+	}
+
+	public void setSerialData(Serializable serialData) {
+		this.serialData = serialData;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableMappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="SerializableHolder" table="LOB_ENTITY">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="serialData" column="SER_DATA" type="serializable"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -4,10 +4,6 @@
 import junit.framework.Test;
 
 import org.hibernate.Session;
-import org.hibernate.dialect.Sybase11Dialect;
-import org.hibernate.dialect.SybaseASE15Dialect;
-import org.hibernate.dialect.SybaseAnywhereDialect;
-import org.hibernate.dialect.SybaseDialect;
 import org.hibernate.junit.functional.FunctionalTestCase;
 import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
 
@@ -23,7 +19,7 @@
 	}
 
 	public String[] getMappings() {
-		return new String[] { "lob/LobMappings.hbm.xml" };
+		return new String[] { "lob/SerializableMappings.hbm.xml" };
 	}
 
 	public static Test suite() {
@@ -36,30 +32,49 @@
 	}
 
 	public void testNewSerializableType() {
-		// Sybase dialects do not support ResultSet.getBlob(String)
-		if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect ) {
-			return;
-		}
+		final String initialPayloadText = "Initial payload";
+		final String changedPayloadText = "Changed payload";
 
-		final String payloadText = "Initial payload";
-
 		Session s = openSession();
 		s.beginTransaction();
-		LobHolder holder = new LobHolder();
-		holder.setSerialData( new SerializableData( payloadText ) );
+		SerializableHolder holder = new SerializableHolder();
 		s.save( holder );
 		s.getTransaction().commit();
 		s.close();
 
 		s = openSession();
 		s.beginTransaction();
-		holder = ( LobHolder ) s.get( LobHolder.class, holder.getId() );
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		assertNull( holder.getSerialData() );
+		holder.setSerialData( new SerializableData( initialPayloadText ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
 		SerializableData serialData = ( SerializableData ) holder.getSerialData();
-		assertEquals( payloadText, serialData.getPayload() );
+		assertEquals( initialPayloadText, serialData.getPayload() );
+		holder.setSerialData( new SerializableData( changedPayloadText ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		serialData = ( SerializableData ) holder.getSerialData();
+		assertEquals( changedPayloadText, serialData.getPayload() );
+		holder.setSerialData( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		assertNull( holder.getSerialData() );
 		s.delete( holder );
 		s.getTransaction().commit();
 		s.close();
 	}
 
-
 }

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextMappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextMappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextMappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongStringHolder" table="LOB_ENTITY_TEXT">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longString" column="LONG_STR" type="text" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/lob/TextTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,51 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Test eager materialization and mutation data mapped by
+ * #{@link org.hibernate.type.TextType}.
+ *
+ * @author Gail Badner
+ */
+public class TextTest extends LongStringTest {
+
+	public TextTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/TextMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TextTest.class );
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/ImageHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/ImageHolder.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/ImageHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Gail Badner
+ */
+public class ImageHolder {
+	private Long id;
+	private byte[] photo;
+
+	public ImageHolder(byte[] photo) {
+		this.photo = photo;
+	}
+
+	public ImageHolder() {
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the photo.
+	 */
+	public byte[] getPhoto() {
+		return photo;
+	}
+
+	/**
+	 * @param photo The photo to set.
+	 */
+	public void setPhoto(byte[] photo) {
+		this.photo = photo;
+	}
+}
\ No newline at end of file

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/TextHolder.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/TextHolder.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/TextHolder.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Gail Badner
+ */
+public class TextHolder {
+	private Long id;
+	private String description;
+
+	public TextHolder(String description) {
+		this.description = description;
+	}
+
+	public TextHolder() {
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}
\ No newline at end of file

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -9,8 +9,11 @@
 import org.hibernate.Transaction;
 import org.hibernate.junit.functional.DatabaseSpecificFunctionalTestCase;
 import org.hibernate.test.sql.hand.Employment;
+import org.hibernate.test.sql.hand.ImageHolder;
 import org.hibernate.test.sql.hand.Organization;
 import org.hibernate.test.sql.hand.Person;
+import org.hibernate.test.sql.hand.TextHolder;
+import org.hibernate.util.ArrayHelper;
 
 /**
  * Abstract test case defining tests for the support for user-supplied (aka
@@ -91,4 +94,81 @@
 		s.close();
 	}
 
+	public void testTextProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		String description = buildLongString( 15000, 'a' );
+		TextHolder holder = new TextHolder( description );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( TextHolder ) s.get(  TextHolder.class, holder.getId() );
+		assertEquals( description, holder.getDescription() );
+		description = buildLongString( 15000, 'b' );
+		holder.setDescription( description );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( TextHolder ) s.get(  TextHolder.class, holder.getId() );
+		assertEquals( description, holder.getDescription() );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	public void testImageProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		byte[] photo = buildLongByteArray( 15000, true );
+		ImageHolder holder = new ImageHolder( photo );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( ImageHolder ) s.get(  ImageHolder.class, holder.getId() );
+		assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
+		photo = buildLongByteArray( 15000, false );
+		holder.setPhoto( photo );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( ImageHolder ) s.get(  ImageHolder.class, holder.getId() );
+		assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	private String buildLongString(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+
+	private byte[] buildLongByteArray(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
 }

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -64,7 +64,35 @@
 		<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
 		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
 	</class>
+  <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
 
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
     <resultset name="org-emp-regionCode">
         <return-scalar column="regionCode" type="string"/>
         <return alias="org" class="Organization"/>
@@ -182,7 +210,15 @@
 		</return>
 		{ call HIBDB2TST.selectAllEmployments() }
 	</sql-query>
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
 
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
 	<!-- DB2 seem to *require* users to specify explicit schema/location when executing a stored procedure *stupid* -->
 	<database-object>
 	  <create>CREATE SCHEMA HIBDB2TST</create>

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -65,6 +65,36 @@
 		<sql-delete>DELETE FROM Employment WHERE EMPID=?</sql-delete> 
 	</class>
 
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TextHolder
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TextHolder SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TextHolder WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO ImageHolder
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE ImageHolder SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM ImageHolder WHERE ID=?</sql-delete>
+    </class>
+    
     <resultset name="org-emp-regionCode">
         <return-scalar column="regionCode" type="string"/>
         <return alias="org" class="Organization"/>
@@ -180,7 +210,15 @@
 		</return>
 		{ call selectAllEmployments() }
 	</sql-query>
-	
+	<sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TextHolder WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM ImageHolder WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
 	<database-object>
 		<create>
 		CREATE PROCEDURE selectAllEmployments ()

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -65,6 +65,36 @@
         <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete>
     </class>
 
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>    
+
     <resultset name="org-emp-regionCode">
         <return-scalar column="regionCode" type="string"/>
         <return alias="org" class="Organization"/>
@@ -138,7 +168,15 @@
         WHERE EMPLOYER = :id AND ENDDATE IS NULL
         ORDER BY STARTDATE ASC
     </sql-query>
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
 
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
     <database-object>
         <create>
             CREATE OR REPLACE FUNCTION testParamHandling (j number, i number)

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+     
+    NOTE: this version is for SQLServer
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" unsaved-value="0" column="ORGID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<set name="employments" 
+			inverse="true"
+			order-by="DUMMY">
+			<key column="EMPLOYER"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+			<loader query-ref="organizationEmployments"/>
+		</set>
+		<!-- query-list name="currentEmployments" 
+			query-ref="organizationCurrentEmployments"-->
+		<loader query-ref="organization"/>
+		<sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update>
+		<sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete>
+	</class>
+	
+	<class name="Person" table="PERSON">
+		<id name="id" unsaved-value="0" column="PERID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<loader query-ref="person"/>
+		<sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update>
+		<sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete>
+	</class>
+	
+	<class name="Employment" table="EMPLOYMENT">
+		<id name="employmentId" unsaved-value="0" column="EMPID">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+		<many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+		<property name="startDate" column="STARTDATE" not-null="true" update="false" insert="false"/>
+		<property name="endDate" column="ENDDATE" insert="false"/>
+		<property name="regionCode" column="REGIONCODE" update="false"/>
+        <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+		<loader query-ref="employment"/>
+   		<sql-insert>
+			INSERT INTO EMPLOYMENT 
+				(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) 
+				VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?)
+		</sql-insert>
+		<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
+		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
+	</class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+	
+	<sql-query name="person">
+		<return alias="p" class="Person" lock-mode="upgrade"/>
+		SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/
+	</sql-query>
+
+	<sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+		SELECT {org.*}, {emp.*}
+		FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+		WHERE org.ORGID=?
+	</sql-query>
+
+
+	<!--sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION
+		WHERE ORGID=?
+	</sql-query-->
+	
+	<sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+		<return alias="org" class="Organization"/>
+		SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID
+	</sql-query>
+	
+	
+	
+
+	
+	<sql-query name="employment">
+		<return alias="emp" class="Employment"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+		FROM EMPLOYMENT
+		WHERE EMPID = ?
+	</sql-query>
+
+	<sql-query name="organizationEmployments">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT {empcol.*}
+		FROM EMPLOYMENT empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>
+
+
+	<sql-query name="organizationCurrentEmployments">
+		<return alias="emp" class="Employment">		    
+			<return-property name="salary"> 
+		      <!-- as multi column properties are not supported via the
+		      {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+			<!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+			<return-property name="endDate" column="myEndDate"/>
+		</return>
+		<synchronize table="EMPLOYMENT"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+		FROM EMPLOYMENT
+		WHERE EMPLOYER = :id AND ENDDATE IS NULL
+		ORDER BY STARTDATE ASC
+	</sql-query>
+
+	<sql-query name="simpleScalar" callable="true">
+		<return-scalar column="name" type="string"/>
+		<return-scalar column="value" type="long"/>
+		{ call simpleScalar(:number) }
+	</sql-query>
+
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long"/>
+		<return-scalar column="value2" type="long"/>
+		{ call paramHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call paramHandling(?,:second) }
+	</sql-query>
+	
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="id" column="EMPID"/>						
+			<return-property name="salary"> 
+				<!-- as multi column properties are not supported via the
+				{}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+				<return-column name="VALUE"/>
+				<return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+		{ call selectAllEmployments() }
+	</sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+    
+	<database-object>
+		<create>
+		CREATE PROCEDURE selectAllEmployments AS
+			SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, 
+			REGIONCODE, EMPID, VALUE, CURRENCY
+			FROM EMPLOYMENT
+		</create>
+		<drop>
+		DROP PROCEDURE selectAllEmployments
+		</drop>
+	</database-object>
+
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of selectAllEmployments to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode selectAllEmployments, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE paramHandling @j int, @i int AS
+			SELECT @j as value, @i as value2
+		</create>
+		<drop>
+		DROP PROCEDURE paramHandling
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of paramHandling to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode paramHandling, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+	<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE simpleScalar @number int AS
+			SELECT @number as value, 'getAll' as name
+		</create>
+		<drop>
+		DROP PROCEDURE simpleScalar
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of simpleScalar to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode simpleScalar, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+</hibernate-mapping>

Added: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java	                        (rev 0)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand.custom.sqlserver;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for SQLServer
+ *
+ * @author Gail Badner
+ */
+public class SQLServerCustomSQLTest extends CustomStoredProcTestSupport {
+
+	public SQLServerCustomSQLTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/sqlserver/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SQLServerCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof SQLServerDialect );
+	}
+}
\ No newline at end of file

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -64,6 +64,36 @@
 		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
 	</class>
 
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
+
     <resultset name="org-emp-regionCode">
         <return-scalar column="regionCode" type="string"/>
         <return alias="org" class="Organization"/>
@@ -182,6 +212,15 @@
 		{ call selectAllEmployments() }
 	</sql-query>
 	
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>    
 	<database-object>
 		<create>
 		CREATE PROCEDURE selectAllEmployments AS

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -4,12 +4,15 @@
 import junit.framework.Test;
 
 import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
 import org.hibernate.dialect.SybaseDialect;
 import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
 import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
 
 /**
- * Custom SQL tests for Sybase/SQLServer (Transact-SQL)
+ * Custom SQL tests for Sybase dialect
  * 
  * @author Gavin King
  */
@@ -28,7 +31,10 @@
 	}
 
 	public boolean appliesTo(Dialect dialect) {
-		return ( dialect instanceof SybaseDialect );
+		return ( dialect instanceof SybaseDialect ||
+				dialect instanceof SybaseASE15Dialect ||
+				dialect instanceof Sybase11Dialect ||
+				dialect instanceof SybaseAnywhereDialect );
 	}
 }
 

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml	2010-04-27 05:46:04 UTC (rev 19297)
@@ -116,6 +116,20 @@
         <property name="length" column="flength"/>
     </class>
 
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+    </class>    
+
     <resultset name="org-emp-regionCode">
         <return-scalar column="regionCode" type="string"/>
         <return alias="org" class="Organization"/>

Modified: core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java	2010-04-26 18:16:39 UTC (rev 19296)
+++ core/branches/Branch_3_3_2_GA_CP/testsuite/src/test/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java	2010-04-27 05:46:04 UTC (rev 19297)
@@ -22,15 +22,18 @@
 import org.hibernate.test.sql.hand.Dimension;
 import org.hibernate.test.sql.hand.Employment;
 import org.hibernate.test.sql.hand.Group;
+import org.hibernate.test.sql.hand.ImageHolder;
 import org.hibernate.test.sql.hand.Order;
 import org.hibernate.test.sql.hand.Organization;
 import org.hibernate.test.sql.hand.Person;
 import org.hibernate.test.sql.hand.Product;
 import org.hibernate.test.sql.hand.SpaceShip;
 import org.hibernate.test.sql.hand.Speech;
+import org.hibernate.test.sql.hand.TextHolder;
 import org.hibernate.transform.BasicTransformerAdapter;
 import org.hibernate.transform.DistinctRootEntityResultTransformer;
 import org.hibernate.transform.Transformers;
+import org.hibernate.util.ArrayHelper;
 
 /**
  * Tests of various features of native SQL queries.
@@ -94,7 +97,13 @@
 		       "    join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER " +
 		       "    join PERSON pers on pers.PERID = emp.EMPLOYEE ";
 	}
+	protected String getDescriptionsSQL() {
+		return "select DESCRIPTION from TEXTHOLDER";
+	}
 
+	protected String getPhotosSQL() {
+		return "select PHOTO from IMAGEHOLDER";
+	}
 	public void testFailOnNoAddEntityOrScalar() {
 		// Note: this passes, but for the wrong reason.
 		//      there is actually an exception thrown, but it is the database
@@ -667,6 +676,66 @@
 		s.close();
 	}
 
+	public void testTextTypeInSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		String description = buildLongString( 15000, 'a' );
+		TextHolder holder = new TextHolder( description );
+		s.persist( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		String descriptionRead = ( String ) s.createSQLQuery( getDescriptionsSQL() )
+				.uniqueResult();
+		assertEquals( description, descriptionRead );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	public void testImageTypeInSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		byte[] photo = buildLongByteArray( 15000, true );
+		ImageHolder holder = new ImageHolder( photo );
+		s.persist( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		byte[] photoRead = ( byte[] ) s.createSQLQuery( getPhotosSQL() )
+				.uniqueResult();
+		assertTrue( ArrayHelper.isEquals( photo, photoRead ) );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	private String buildLongString(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+
+	private byte[] buildLongByteArray(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
 	private static class UpperCasedAliasToEntityMapResultTransformer extends BasicTransformerAdapter implements Serializable {
 		public Object transformTuple(Object[] tuple, String[] aliases) {
 			Map result = new HashMap( tuple.length );



More information about the hibernate-commits mailing list