Hibernate和Oracle VARRAYS / NESTED TABLE [英] Hibernate and Oracle VARRAYS/NESTED TABLE
问题描述
我目前使用Hibernate 3作为我的ORM框架,但是我看不到如何将Hibernate映射到数据库中的NESTED TABLE / VARRAY数据类型。
我研究了在Hibernate中定义自定义类型,但没有成功。 (Hibernate甚至可以处理UNCOLUMN_VALUE关键字来取消对子表的访问)
有人知道如何在Hibernate中实现这些数据类型吗?
谢谢大家的帮助。
- TBW。
Hibernate的UserType用于Oracle的NUMBERS表。
OracleNativeExtractor在此处找到: https://community.jboss.org/wiki/MappingOracleXmlTypeToDocument 。字符串YOUR_CUSTOM_ARRAY_TYPE替换为您的名字。
import oracle.sql.ARRAY;
导入oracle.sql.ArrayDescriptor;
import org.apache.commons.lang.ArrayUtils;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import java.io.Serializable;
import java.sql。*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayUserType
实现UserType,可序列化{
private static final OracleNativeExtractor EXTRACTOR = new OracleNativeExtractor();
@Override
public int [] sqlTypes(){
return new int [] {Types.ARRAY};
}
@Override
public Class returnedClass(){
return List.class;
$ b @Override
public boolean equals(Object x,Object y)throws HibernateException {
if(x == null&& y == null )返回true;
else if(x == null&& y!= null)return false;
else返回x.equals(y);
}
@Override
public int hashCode(Object x)throws HibernateException {
return x.hashCode();
$ b @Override
public Object nullSafeGet(ResultSet rs,String [] names,Object owner)throws HibernateException,SQLException {
返回Arrays.asList(ArrayUtils。 toObject(((ARRAY)rs.getObject(names [0]))。getLongArray()));
$ b @Override
public void nullSafeSet(PreparedStatement st,Object value,int index)throws HibernateException,SQLException {
ARRAY array = null;
if(value!= null){
Connection nativeConn = EXTRACTOR.getNativeConnection(st.getConnection());
ArrayDescriptor描述符=
ArrayDescriptor.createDescriptor(YOUR_CUSTOM_ARRAY_TYPE,nativeConn);
array = new ARRAY(描述符,nativeConn,((List< Long>)值).toArray(new Long [] {}));
}
st.setObject(1,array);
$ b @Override
public Object deepCopy(Object value)抛出HibernateException {
if(value == null)return null;
返回新的ArrayList< Long>((List< Long>)value);
}
@Override
public boolean isMutable(){
return false;
}
public Object assemble(Serializable _cached,Object _owner)
throws HibernateException {
return _cached;
}
public可串行化反汇编(Object _obj)
抛出HibernateException {
return(Serializable)_obj;
$ b @Override
public Object replace(Object original,Object target,Object owner)throws HibernateException {
return deepCopy(original);
}
}
Oracle supports the use of VARRAYS and NESTED TABLE data types, allowing multivalued attributes. (http://www.orafaq.com/wiki/NESTED_TABLE)
I am currently using Hibernate 3 as my ORM framework, but I can't see how I can map Hibernate to a NESTED TABLE/VARRAY data type in my database.
I looked at defining custom types in Hibernate, with no success. (Can Hibernate even handle the "COLUMN_VALUE" Oracle keyword necessary to unnest the subtable?)
Does anyone know how to implement these data types in Hibernate?
Thank you all for your help.
-- TBW.
Hibernate's UserType for Oracle's TABLE OF NUMBERS. OracleNativeExtractor found here : https://community.jboss.org/wiki/MappingOracleXmlTypeToDocument . String YOUR_CUSTOM_ARRAY_TYPE replace with your name.
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import org.apache.commons.lang.ArrayUtils;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import java.io.Serializable;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayUserType
implements UserType, Serializable {
private static final OracleNativeExtractor EXTRACTOR = new OracleNativeExtractor();
@Override
public int[] sqlTypes() {
return new int[]{Types.ARRAY};
}
@Override
public Class returnedClass() {
return List.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if (x == null && y == null) return true;
else if (x == null && y != null) return false;
else return x.equals(y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
return Arrays.asList(ArrayUtils.toObject(((ARRAY) rs.getObject(names[0])).getLongArray()));
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
ARRAY array = null;
if (value != null) {
Connection nativeConn = EXTRACTOR.getNativeConnection(st.getConnection());
ArrayDescriptor descriptor =
ArrayDescriptor.createDescriptor("YOUR_CUSTOM_ARRAY_TYPE", nativeConn);
array = new ARRAY(descriptor, nativeConn, ((List<Long>) value).toArray(new Long[]{}));
}
st.setObject(1, array);
}
@Override
public Object deepCopy(Object value) throws HibernateException {
if (value == null) return null;
return new ArrayList<Long>((List<Long>) value);
}
@Override
public boolean isMutable() {
return false;
}
public Object assemble(Serializable _cached, Object _owner)
throws HibernateException {
return _cached;
}
public Serializable disassemble(Object _obj)
throws HibernateException {
return (Serializable) _obj;
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return deepCopy(original);
}
}
这篇关于Hibernate和Oracle VARRAYS / NESTED TABLE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!