Hibernate和Oracle VARRAYS / NESTED TABLE [英] Hibernate and Oracle VARRAYS/NESTED TABLE

查看:122
本文介绍了Hibernate和Oracle VARRAYS / NESTED TABLE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Oracle支持使用VARRAYS和NESTED TABLE数据类型,从而实现多值属性。 ( http://www.orafaq.com/wiki/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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆