HHH-4405 Integrate new long string and binary property types in core with annotations
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17685 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
85212c51c4
commit
ea91bf00a0
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
|
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
|
||||||
* indicated by the @author tags or express copyright attribution
|
* indicated by the @author tags or express copyright attribution
|
||||||
* statements applied by the authors. All third-party contributions are
|
* statements applied by the authors. All third-party contributions are
|
||||||
* distributed under license by Red Hat Middleware LLC.
|
* distributed under license by Red Hat Middleware LLC.
|
||||||
|
@ -34,6 +34,7 @@ import javax.persistence.Temporal;
|
||||||
|
|
||||||
import org.hibernate.AnnotationException;
|
import org.hibernate.AnnotationException;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.annotations.Parameter;
|
import org.hibernate.annotations.Parameter;
|
||||||
import org.hibernate.annotations.Type;
|
import org.hibernate.annotations.Type;
|
||||||
import org.hibernate.annotations.common.reflection.XClass;
|
import org.hibernate.annotations.common.reflection.XClass;
|
||||||
|
@ -45,13 +46,11 @@ import org.hibernate.cfg.NotYetImplementedException;
|
||||||
import org.hibernate.cfg.SetSimpleValueTypeSecondPass;
|
import org.hibernate.cfg.SetSimpleValueTypeSecondPass;
|
||||||
import org.hibernate.mapping.SimpleValue;
|
import org.hibernate.mapping.SimpleValue;
|
||||||
import org.hibernate.mapping.Table;
|
import org.hibernate.mapping.Table;
|
||||||
import org.hibernate.type.ByteArrayBlobType;
|
|
||||||
import org.hibernate.type.CharacterArrayClobType;
|
import org.hibernate.type.CharacterArrayClobType;
|
||||||
import org.hibernate.type.EnumType;
|
import org.hibernate.type.EnumType;
|
||||||
import org.hibernate.type.PrimitiveByteArrayBlobType;
|
|
||||||
import org.hibernate.type.PrimitiveCharacterArrayClobType;
|
import org.hibernate.type.PrimitiveCharacterArrayClobType;
|
||||||
import org.hibernate.type.SerializableToBlobType;
|
import org.hibernate.type.SerializableToBlobType;
|
||||||
import org.hibernate.type.StringClobType;
|
import org.hibernate.type.WrappedMaterializedBlobType;
|
||||||
import org.hibernate.util.StringHelper;
|
import org.hibernate.util.StringHelper;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -158,7 +157,7 @@ public class SimpleValueBinder {
|
||||||
type = "blob";
|
type = "blob";
|
||||||
}
|
}
|
||||||
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, String.class ) ) {
|
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, String.class ) ) {
|
||||||
type = StringClobType.class.getName();
|
type = Hibernate.MATERIALIZED_CLOB.getName();
|
||||||
}
|
}
|
||||||
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Character.class ) && isArray ) {
|
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Character.class ) && isArray ) {
|
||||||
type = CharacterArrayClobType.class.getName();
|
type = CharacterArrayClobType.class.getName();
|
||||||
|
@ -167,10 +166,10 @@ public class SimpleValueBinder {
|
||||||
type = PrimitiveCharacterArrayClobType.class.getName();
|
type = PrimitiveCharacterArrayClobType.class.getName();
|
||||||
}
|
}
|
||||||
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Byte.class ) && isArray ) {
|
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Byte.class ) && isArray ) {
|
||||||
type = ByteArrayBlobType.class.getName();
|
type = WrappedMaterializedBlobType.class.getName();
|
||||||
}
|
}
|
||||||
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, byte.class ) && isArray ) {
|
else if ( mappings.getReflectionManager().equals( returnedClassOrElement, byte.class ) && isArray ) {
|
||||||
type = PrimitiveByteArrayBlobType.class.getName();
|
type = Hibernate.MATERIALIZED_BLOB.getName();
|
||||||
}
|
}
|
||||||
else if ( mappings.getReflectionManager()
|
else if ( mappings.getReflectionManager()
|
||||||
.toXClass( Serializable.class )
|
.toXClass( Serializable.class )
|
||||||
|
|
|
@ -45,8 +45,11 @@ import org.hibernate.util.ArrayHelper;
|
||||||
* Map a Byte[] into a Blob
|
* Map a Byte[] into a Blob
|
||||||
* Experimental
|
* Experimental
|
||||||
*
|
*
|
||||||
|
* @deprecated replaced by Hibernate Core's {@link org.hibernate.type.WrappedMaterializedBlobType}
|
||||||
|
*
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class ByteArrayBlobType extends AbstractLobType {
|
public class ByteArrayBlobType extends AbstractLobType {
|
||||||
|
|
||||||
public int[] sqlTypes(Mapping mapping) throws MappingException {
|
public int[] sqlTypes(Mapping mapping) throws MappingException {
|
||||||
|
|
|
@ -25,9 +25,11 @@ package org.hibernate.type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map a byte[] to a Blob
|
* Map a byte[] to a Blob
|
||||||
|
* @deprecated replaced by Hibernate Core's {@link org.hibernate.type.MaterializedBlobType}
|
||||||
*
|
*
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class PrimitiveByteArrayBlobType extends ByteArrayBlobType {
|
public class PrimitiveByteArrayBlobType extends ByteArrayBlobType {
|
||||||
public Class getReturnedClass() {
|
public Class getReturnedClass() {
|
||||||
return byte[].class;
|
return byte[].class;
|
||||||
|
|
|
@ -37,9 +37,11 @@ import org.hibernate.usertype.UserType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map a String to a Clob
|
* Map a String to a Clob
|
||||||
|
* @deprecated replaced by Hibernate Core's {@link org.hibernate.type.MaterializedClobType}
|
||||||
*
|
*
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class StringClobType implements UserType, Serializable {
|
public class StringClobType implements UserType, Serializable {
|
||||||
public int[] sqlTypes() {
|
public int[] sqlTypes() {
|
||||||
return new int[]{Types.CLOB};
|
return new int[]{Types.CLOB};
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
package org.hibernate.type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <tt>materialized_blob</tt>: A type that maps an SQL BLOB to Java Byte[].
|
||||||
|
*
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class WrappedMaterializedBlobType extends MaterializedBlobType {
|
||||||
|
public Class getReturnedClass() {
|
||||||
|
return Byte[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object toExternalFormat(byte[] bytes) {
|
||||||
|
if (bytes == null)
|
||||||
|
return null;
|
||||||
|
return wrapPrimitive(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] toInternalFormat(Object bytes) {
|
||||||
|
if (bytes == null)
|
||||||
|
return null;
|
||||||
|
return unwrapNonPrimitive((Byte[]) bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Byte[] wrapPrimitive(byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
Byte[] result = new Byte[length];
|
||||||
|
for (int index = 0; index < length; index++) {
|
||||||
|
result[index] = Byte.valueOf(bytes[index]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] unwrapNonPrimitive(Byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
byte[] result = new byte[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[i] = bytes[i].byteValue();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -125,7 +125,7 @@ public abstract class TestCase extends junit.framework.TestCase {
|
||||||
dialectList.addAll(Arrays.asList(requiredDialects));
|
dialectList.addAll(Arrays.asList(requiredDialects));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( dialectList.isEmpty() || dialectList.contains(Dialect.getDialect().getClass()) ) {
|
if ( (dialectList.isEmpty() || dialectList.contains(Dialect.getDialect().getClass())) && appliesTo(Dialect.getDialect()) ) {
|
||||||
skip = false;
|
skip = false;
|
||||||
} else {
|
} else {
|
||||||
log.warn("Skipping test {}, because test does not apply for dialect {}", runMethod.getName(), Dialect
|
log.warn("Skipping test {}, because test does not apply for dialect {}", runMethod.getName(), Dialect
|
||||||
|
@ -134,6 +134,10 @@ public abstract class TestCase extends junit.framework.TestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean appliesTo( Dialect dialect ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private void runTestMethod( Method runMethod ) throws Throwable {
|
private void runTestMethod( Method runMethod ) throws Throwable {
|
||||||
try {
|
try {
|
||||||
runMethod.invoke(this, new Class[0]);
|
runMethod.invoke(this, new Class[0]);
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import org.hibernate.HibernateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type that maps an SQL LONGVARCHAR to a Java Character [].
|
||||||
|
*
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class CharacterArrayTextType extends PrimitiveCharacterArrayTextType {
|
||||||
|
|
||||||
|
public Class getReturnedClass() {
|
||||||
|
return Character[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object get(ResultSet rs, String name) throws HibernateException,
|
||||||
|
SQLException {
|
||||||
|
char[] text = (char[]) super.get(rs, name);
|
||||||
|
if (text == null)
|
||||||
|
return null;
|
||||||
|
return wrapPrimitive(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(PreparedStatement st, Object value, int index)
|
||||||
|
throws HibernateException, SQLException {
|
||||||
|
Character[] cs = (Character[]) value;
|
||||||
|
super.set(st, unwrapNonPrimitive(cs), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Character[] wrapPrimitive(char[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
Character[] result = new Character[length];
|
||||||
|
for (int index = 0; index < length; index++) {
|
||||||
|
result[index] = Character.valueOf(bytes[index]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private char[] unwrapNonPrimitive(Character[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
char[] result = new char[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[i] = bytes[i].charValue();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.hibernate.test.annotations.lob;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Dog implements Serializable {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class ImageHolder {
|
||||||
|
private Long id;
|
||||||
|
private byte[] longByteArray;
|
||||||
|
private Dog dog;
|
||||||
|
private Byte[] picByteArray;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@org.hibernate.annotations.Type(type="image")
|
||||||
|
public byte[] getLongByteArray() {
|
||||||
|
return longByteArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLongByteArray(byte[] longByteArray) {
|
||||||
|
this.longByteArray = longByteArray;
|
||||||
|
}
|
||||||
|
@org.hibernate.annotations.Type(type="serializable_image")
|
||||||
|
public Dog getDog() {
|
||||||
|
return dog;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDog(Dog dog) {
|
||||||
|
this.dog = dog;
|
||||||
|
}
|
||||||
|
@org.hibernate.annotations.Type(type="wrapped_image")
|
||||||
|
public Byte[] getPicByteArray() {
|
||||||
|
return picByteArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPicByteArray(Byte[] picByteArray) {
|
||||||
|
this.picByteArray = picByteArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.dialect.SQLServerDialect;
|
||||||
|
import org.hibernate.dialect.Sybase11Dialect;
|
||||||
|
import org.hibernate.dialect.SybaseASE15Dialect;
|
||||||
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
|
import org.hibernate.test.annotations.RequiresDialect;
|
||||||
|
import org.hibernate.test.annotations.TestCase;
|
||||||
|
import org.hibernate.util.ArrayHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests eager materialization and mutation of data mapped by
|
||||||
|
* {@link org.hibernate.type.ImageType}.
|
||||||
|
*
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
@RequiresDialect( { SybaseASE15Dialect.class, SQLServerDialect.class,
|
||||||
|
SybaseDialect.class, Sybase11Dialect.class })
|
||||||
|
public class ImageTest extends TestCase {
|
||||||
|
private static final int ARRAY_SIZE = 10000;
|
||||||
|
|
||||||
|
public void testBoundedLongByteArrayAccess() {
|
||||||
|
byte[] original = buildRecursively(ARRAY_SIZE, true);
|
||||||
|
byte[] changed = buildRecursively(ARRAY_SIZE, false);
|
||||||
|
|
||||||
|
Session s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
ImageHolder entity = new ImageHolder();
|
||||||
|
s.save(entity);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
entity = (ImageHolder) s.get(ImageHolder.class, entity.getId());
|
||||||
|
assertNull(entity.getLongByteArray());
|
||||||
|
assertNull(entity.getDog());
|
||||||
|
assertNull(entity.getPicByteArray());
|
||||||
|
entity.setLongByteArray(original);
|
||||||
|
Dog dog = new Dog();
|
||||||
|
dog.setName("rabbit");
|
||||||
|
entity.setDog(dog);
|
||||||
|
entity.setPicByteArray(wrapPrimitive(original));
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
entity = (ImageHolder) s.get(ImageHolder.class, entity.getId());
|
||||||
|
assertEquals(ARRAY_SIZE, entity.getLongByteArray().length);
|
||||||
|
assertEquals(original, entity.getLongByteArray());
|
||||||
|
assertEquals(ARRAY_SIZE, entity.getPicByteArray().length);
|
||||||
|
assertEquals(original, unwrapNonPrimitive(entity.getPicByteArray()));
|
||||||
|
assertNotNull(entity.getDog());
|
||||||
|
assertEquals(dog.getName(), entity.getDog().getName());
|
||||||
|
entity.setLongByteArray(changed);
|
||||||
|
entity.setPicByteArray(wrapPrimitive(changed));
|
||||||
|
dog.setName("papa");
|
||||||
|
entity.setDog(dog);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
entity = (ImageHolder) s.get(ImageHolder.class, entity.getId());
|
||||||
|
assertEquals(ARRAY_SIZE, entity.getLongByteArray().length);
|
||||||
|
assertEquals(changed, entity.getLongByteArray());
|
||||||
|
assertEquals(ARRAY_SIZE, entity.getPicByteArray().length);
|
||||||
|
assertEquals(changed, unwrapNonPrimitive(entity.getPicByteArray()));
|
||||||
|
assertNotNull(entity.getDog());
|
||||||
|
assertEquals(dog.getName(), entity.getDog().getName());
|
||||||
|
entity.setLongByteArray(null);
|
||||||
|
entity.setPicByteArray(null);
|
||||||
|
entity.setDog(null);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
entity = (ImageHolder) s.get(ImageHolder.class, entity.getId());
|
||||||
|
assertNull(entity.getLongByteArray());
|
||||||
|
assertNull(entity.getDog());
|
||||||
|
assertNull(entity.getPicByteArray());
|
||||||
|
s.delete(entity);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Byte[] wrapPrimitive(byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
Byte[] result = new Byte[length];
|
||||||
|
for (int index = 0; index < length; index++) {
|
||||||
|
result[index] = Byte.valueOf(bytes[index]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] unwrapNonPrimitive(Byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
byte[] result = new byte[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[i] = bytes[i].byteValue();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageTest(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String[] getAnnotatedPackages() {
|
||||||
|
return new String[] { "org.hibernate.test.annotations.lob" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?>[] getMappings() {
|
||||||
|
return new Class[] { ImageHolder.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package org.hibernate.test.annotations.lob;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.test.annotations.TestCase;
|
import org.hibernate.test.annotations.TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,6 +118,11 @@ public class LobTest extends TestCase {
|
||||||
super( x );
|
super( x );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean appliesTo(Dialect dialect) {
|
||||||
|
return dialect.supportsExpectedLobUsagePattern();
|
||||||
|
}
|
||||||
|
|
||||||
protected Class[] getMappings() {
|
protected Class[] getMappings() {
|
||||||
return new Class[]{
|
return new Class[]{
|
||||||
Book.class,
|
Book.class,
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.Type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An entity containing data that is materialized into a String immediately.
|
||||||
|
* The hibernate type mapped for {@link #LONGVARCHAR} determines the SQL type
|
||||||
|
* asctually used.
|
||||||
|
*
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class LongStringHolder {
|
||||||
|
private Long id;
|
||||||
|
private char[] name;
|
||||||
|
private Character[] whatEver;
|
||||||
|
private String longString;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Type(type = "text")
|
||||||
|
public String getLongString() {
|
||||||
|
return longString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLongString(String longString) {
|
||||||
|
this.longString = longString;
|
||||||
|
}
|
||||||
|
@Type(type = "char_text")
|
||||||
|
public char[] getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(char[] name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
@Type(type = "wrapped_char_text")
|
||||||
|
public Character[] getWhatEver() {
|
||||||
|
return whatEver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWhatEver(Character[] whatEver) {
|
||||||
|
this.whatEver = whatEver;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.type.TextType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type that maps an SQL LONGVARCHAR to a Java char [].
|
||||||
|
*
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class PrimitiveCharacterArrayTextType extends TextType {
|
||||||
|
public Class getReturnedClass() {
|
||||||
|
return char[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object get(ResultSet rs, String name) throws HibernateException,
|
||||||
|
SQLException {
|
||||||
|
String text = (String) super.get(rs, name);
|
||||||
|
if (text == null)
|
||||||
|
return null;
|
||||||
|
return text.toCharArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(PreparedStatement st, Object value, int index)
|
||||||
|
throws HibernateException, SQLException {
|
||||||
|
char[] cs = (char[]) value;
|
||||||
|
String text = String.valueOf(cs);
|
||||||
|
|
||||||
|
super.set(st, text, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(Object val) {
|
||||||
|
return String.valueOf(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.hibernate.type.ImageType;
|
||||||
|
import org.hibernate.util.SerializationHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type that maps an SQL LONGVARBINARY to a serializable Java object.
|
||||||
|
*
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class SerializableToImageType extends ImageType {
|
||||||
|
public Class getReturnedClass() {
|
||||||
|
return Serializable.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object toExternalFormat(byte[] bytes) {
|
||||||
|
if (bytes == null)
|
||||||
|
return null;
|
||||||
|
return SerializationHelper.deserialize(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] toInternalFormat(Object bytes) {
|
||||||
|
return SerializationHelper.serialize((Serializable) bytes);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,163 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.dialect.SQLServerDialect;
|
||||||
|
import org.hibernate.dialect.Sybase11Dialect;
|
||||||
|
import org.hibernate.dialect.SybaseASE15Dialect;
|
||||||
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
|
import org.hibernate.test.annotations.RequiresDialect;
|
||||||
|
import org.hibernate.test.annotations.TestCase;
|
||||||
|
import org.hibernate.util.ArrayHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests eager materialization and mutation of long strings.
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
@RequiresDialect({SybaseASE15Dialect.class,SQLServerDialect.class,SybaseDialect.class,Sybase11Dialect.class})
|
||||||
|
public class TextTest extends TestCase {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getMappings() {
|
||||||
|
return new Class[] { LongStringHolder.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int LONG_STRING_SIZE = 10000;
|
||||||
|
|
||||||
|
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());
|
||||||
|
assertNull(entity.getName());
|
||||||
|
assertNull(entity.getWhatEver());
|
||||||
|
entity.setLongString(original);
|
||||||
|
entity.setName(original.toCharArray());
|
||||||
|
entity.setWhatEver(wrapPrimitive(original.toCharArray()));
|
||||||
|
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());
|
||||||
|
assertNotNull(entity.getName());
|
||||||
|
assertEquals(LONG_STRING_SIZE, entity.getName().length);
|
||||||
|
assertEquals(original.toCharArray(), entity.getName());
|
||||||
|
assertNotNull(entity.getWhatEver());
|
||||||
|
assertEquals(LONG_STRING_SIZE, entity.getWhatEver().length);
|
||||||
|
assertEquals(original.toCharArray(), unwrapNonPrimitive(entity.getWhatEver()));
|
||||||
|
entity.setLongString(changed);
|
||||||
|
entity.setName(changed.toCharArray());
|
||||||
|
entity.setWhatEver(wrapPrimitive(changed.toCharArray()));
|
||||||
|
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());
|
||||||
|
assertNotNull(entity.getName());
|
||||||
|
assertEquals(LONG_STRING_SIZE, entity.getName().length);
|
||||||
|
assertEquals(changed.toCharArray(), entity.getName());
|
||||||
|
assertNotNull(entity.getWhatEver());
|
||||||
|
assertEquals(LONG_STRING_SIZE, entity.getWhatEver().length);
|
||||||
|
assertEquals(changed.toCharArray(), unwrapNonPrimitive(entity.getWhatEver()));
|
||||||
|
entity.setLongString(null);
|
||||||
|
entity.setName(null);
|
||||||
|
entity.setWhatEver(null);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.beginTransaction();
|
||||||
|
entity = (LongStringHolder) s.get(LongStringHolder.class, entity
|
||||||
|
.getId());
|
||||||
|
assertNull(entity.getLongString());
|
||||||
|
assertNull(entity.getName());
|
||||||
|
assertNull(entity.getWhatEver());
|
||||||
|
s.delete(entity);
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertEquals(char[] val1, char[] val2) {
|
||||||
|
if (!ArrayHelper.isEquals(val1, val2)) {
|
||||||
|
throw new AssertionFailedError("byte arrays did not match");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildRecursively(int size, char baseChar) {
|
||||||
|
StringBuffer buff = new StringBuffer();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
buff.append(baseChar);
|
||||||
|
}
|
||||||
|
return buff.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Character[] wrapPrimitive(char[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
Character[] result = new Character[length];
|
||||||
|
for (int index = 0; index < length; index++) {
|
||||||
|
result[index] = Character.valueOf(bytes[index]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private char[] unwrapNonPrimitive(Character[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
char[] result = new char[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[i] = bytes[i].charValue();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String[] getAnnotatedPackages() {
|
||||||
|
return new String[] { "org.hibernate.test.annotations.lob" };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
//$Id: $
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* 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.annotations.lob;
|
||||||
|
|
||||||
|
import org.hibernate.type.ImageType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type that maps an SQL LONGVARBINARY to Java Byte[].
|
||||||
|
*
|
||||||
|
* @author Strong Liu
|
||||||
|
*/
|
||||||
|
public class WrappedImageType extends ImageType{
|
||||||
|
public Class getReturnedClass() {
|
||||||
|
return Byte[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object toExternalFormat(byte[] bytes) {
|
||||||
|
if(bytes==null)return null;
|
||||||
|
return wrapPrimitive(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] toInternalFormat(Object bytes) {
|
||||||
|
if(bytes==null)return null;
|
||||||
|
return unwrapNonPrimitive(( Byte[] ) bytes);
|
||||||
|
}
|
||||||
|
private Byte[] wrapPrimitive(byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
Byte[] result = new Byte[length];
|
||||||
|
for ( int index = 0; index < length ; index++ ) {
|
||||||
|
result[index] = Byte.valueOf( bytes[index] );
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] unwrapNonPrimitive(Byte[] bytes) {
|
||||||
|
int length = bytes.length;
|
||||||
|
byte[] result = new byte[length];
|
||||||
|
for ( int i = 0; i < length ; i++ ) {
|
||||||
|
result[i] = bytes[i].byteValue();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* Test package for metatata facilities
|
||||||
|
* It contains an example of filter metadata
|
||||||
|
*/
|
||||||
|
@TypeDefs(
|
||||||
|
{
|
||||||
|
@TypeDef(
|
||||||
|
name = "wrapped_char_text",
|
||||||
|
typeClass = org.hibernate.test.annotations.lob.CharacterArrayTextType.class
|
||||||
|
),
|
||||||
|
@TypeDef(
|
||||||
|
name = "char_text",
|
||||||
|
typeClass = org.hibernate.test.annotations.lob.PrimitiveCharacterArrayTextType.class
|
||||||
|
),
|
||||||
|
@TypeDef(
|
||||||
|
name = "wrapped_image",
|
||||||
|
typeClass = org.hibernate.test.annotations.lob.WrappedImageType.class
|
||||||
|
),
|
||||||
|
@TypeDef(
|
||||||
|
name = "serializable_image",
|
||||||
|
typeClass = org.hibernate.test.annotations.lob.SerializableToImageType.class
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
package org.hibernate.test.annotations.lob;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.TypeDef;
|
||||||
|
import org.hibernate.annotations.TypeDefs;
|
||||||
|
|
Loading…
Reference in New Issue