我已将UserType
用于存储List
字段作为Postgres ARRAY
列。类型为parameterised,以便我可以告诉它我要存储的列表类型(String
,Double
等)。这意味着我必须在.hbm.xml
文件中指定它:
<property name="foo">
<column name="foo" sql-type="text[]" />
<type name="EmbeddedListType">
<param name="elementType">string</param>
</type>
</property>
我真的不想在配置中指定sql-type
和elementType
。所以,我有两个问题:
sql-type
的内容? UserType
界面中的所有方法似乎都不是我需要的。 修改:目前,如果我没有指定此内容,我会收到org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003
我已尝试实施DynamicParameterizedType
,但properties对象不包含PARAMETER_TYPE
等字段。如果我要使用动态类型,我可能需要对其进行不同的配置吗?
以下是我的actual class和mapping 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[]");
或者只是在寻找麻烦?我的意思是,我已经对它进行了测试,似乎有效。