gpt4 book ai didi

java - Hibernate 和 Oracle VARRAYS/NESTED TABLE

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:19 26 4
gpt4 key购买 nike

Oracle 支持使用 VARRAYS 和 NESTED TABLE 数据类型,允许多值属性。 ( http://www.orafaq.com/wiki/NESTED_TABLE )

我目前正在使用 Hibernate 3 作为我的 ORM 框架,但我看不到如何将 Hibernate 映射到我的数据库中的 NESTED TABLE/VARRAY 数据类型。

我查看了在 Hibernate 中定义自定义类型,但没有成功。 (Hibernate 甚至可以处理取消嵌套子表所需的“COLUMN_VALUE”Oracle 关键字吗?)

有谁知道如何在 Hibernate 中实现这些数据类型?

谢谢大家的帮助。

-- 待定。

最佳答案

Oracle 的 TABLE OF NUMBERS 的 Hibernate 用户类型。在这里找到 OracleNativeExtractor:https://community.jboss.org/wiki/MappingOracleXmlTypeToDocument .字符串 YOUR_CUSTOM_ARRAY_TYPE 替换为您的姓名。

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);
}
}

关于java - Hibernate 和 Oracle VARRAYS/NESTED TABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4712566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com