在UserType中推断类型信息

时间:2016-05-27 07:15:30

标签: java hibernate postgresql

我已将UserType用于存储List字段作为Postgres ARRAY列。类型为parameterised,以便我可以告诉它我要存储的列表类型(StringDouble等)。这意味着我必须在.hbm.xml文件中指定它:

<property name="foo">
    <column name="foo" sql-type="text[]" />
    <type name="EmbeddedListType">
        <param name="elementType">string</param>
    </type>
</property>

我真的不想在配置中指定sql-typeelementType。所以,我有两个问题:

  1. 是否有某种方法可以挂钩Hibernate的配置过程以获取该类型绑定的实际POJO字段?
  2. 如何返回设置sql-type的内容? UserType界面中的所有方法似乎都不是我需要的。 修改:目前,如果我没有指定此内容,我会收到org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003
  3. 我已尝试实施DynamicParameterizedType,但properties对象不包含PARAMETER_TYPE等字段。如果我要使用动态类型,我可能需要对其进行不同的配置吗?

    以下是我的actual classmapping file(GPL3)的完整代码。 Hitbernate 5.1.0.Final,postgresql驱动程序9.4-1201-jdbc41

    编辑:定义我自己的类型

    我看到你可以extend a dialect来定义JDBC类型2003应该如何映射到列定义:

    public class PostgreSQLDialectArray extends org.hibernate.dialect.PostgreSQLDialect {
        public PostgreSQLDialectArray() { 
            super(); 
            registerHibernateType(Types.ARRAY, "array"); 
        }
    }
    

    这应避免在映射中需要sql-type,但Postgres拒绝它,因为数组本身需要输入,例如"integer array"而不只是"array"。但是Hibernate似乎将每个Types int映射到一个值。可以定义我自己的类型吗?例如。我可以将UserType更改为返回:

    public final static int LONGVARCHAR_ARRAY = 8000;
    public final static int DOUBLE_ARRAY = 8001;
    
    @Override
    public int[] sqlTypes() {
        if (componentType == Double.class)
            return new int[] { DOUBLE_ARRAY };
        else if (componentType == String.class)
            return new int[] { LONGVARCHAR_ARRAY };
        else
            throw new IllegalArgumentException();
    }
    

    然后用我的方言:

    registerHibernateType(EmbeddedListType.DOUBLE_ARRAY, "double precision[]");
    registerHibernateType(EmbeddedListType.LONGVARCHAR_ARRAY, "text[]");
    

    或者只是在寻找麻烦?我的意思是,我已经对它进行了测试,似乎有效。

0 个答案:

没有答案