org.hibernate.type.ArrayType Maven / Gradle / Ivy
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.type;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.collection.internal.PersistentArrayHolder;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.persister.collection.CollectionPersister;
/**
* A type for persistent arrays.
* @author Gavin King
*/
public class ArrayType extends CollectionType {
private final Class elementClass;
private final Class arrayClass;
public ArrayType(TypeFactory.TypeScope typeScope, String role, String propertyRef, Class elementClass) {
super( typeScope, role, propertyRef );
this.elementClass = elementClass;
arrayClass = Array.newInstance(elementClass, 0).getClass();
}
public Class getReturnedClass() {
return arrayClass;
}
public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister, Serializable key)
throws HibernateException {
return new PersistentArrayHolder(session, persister);
}
/**
* Not defined for collections of primitive type
*/
public Iterator getElementsIterator(Object collection) {
return Arrays.asList( (Object[]) collection ).iterator();
}
public PersistentCollection wrap(SessionImplementor session, Object array) {
return new PersistentArrayHolder(session, array);
}
public boolean isArrayType() {
return true;
}
public String toLoggableString(Object value, SessionFactoryImplementor factory) throws HibernateException {
if ( value == null ) {
return "null";
}
int length = Array.getLength(value);
List list = new ArrayList(length);
Type elemType = getElementType(factory);
for ( int i=0; i