我已成功使用Postgres创建用户类型,并且可以成功读写。
@org.hibernate.annotations.Type(type = "com.xxx.datamodel.ext.FooType" )
@Column(name = "foo", nullable = false)
private int[] foo
@org.hibernate.annotations.Type(type = "com.xxx.datamodel.ext.BarType" )
@Column(name = "bar", nullable = false)
private double[] bar
但是,当我尝试使用HSQLDialect(用于单元测试)时,我得到:
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003
at org.hibernate.dialect.TypeNames.get(TypeNames.java:79)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:104)
at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:314)
at org.hibernate.mapping.Column.getSqlType(Column.java:205)
at org.hibernate.mapping.Table.sqlCreateString(Table.java:420)
at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:895)
at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:105)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:353)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
... 55 more
2003是java.sql.Types.Array 看起来它在测试之前尝试创建模式时失败了,我不知道如何告诉HSQL创建正确的类型/模式。
我发现了另一个有点相关的帖子,建议我扩展HSQLDialect并注册列类型:
registerColumnType(Types.ARRAY,
FooType.class.getCanonicalName());
registerColumnType(Types.ARRAY,
BarType.class.getCanonicalName());
此方法的问题在于每个SQL类型只允许一个映射,并且在int[]
和double[]
之间无法正确解析。不确定这是否是正确的方法。也许还有其他方法可以覆盖架构创建过程?
答案 0 :(得分:1)
我通过解决它来解决它。我此时使用了Hibernate session.doWork(...)来获取JDBC连接并使用JDBC完成:http://docs.oracle.com/javase/tutorial/jdbc/basics/array.html
提示:定义数组类型(调用
时必须执行的操作)connection.createArrayOf(TYPENAME,对象[])
)您可以查阅此源代码以获取允许类型的名称: http://grepcode.com/file/repo1.maven.org/maven2/postgresql/postgresql/9.0-801.jdbc4/org/postgresql/jdbc2/TypeInfoCache.java
(这是这个答案的提示:Updating ResultSets with SQL Array types in JDBC / PostgreSQL)
答案 1 :(得分:0)
我通过解决它来解决这个问题。 HSQLDB根本不支持Arrays。但是,由于我需要做的就是为我的单元测试序列化和反序列化我的数组,我可以将所有内容转换为BLOB ...
要执行此操作,我只是修改了我的UserType对象以返回一个Array或Blob,具体取决于是否设置了静态全局标志,默认使用Arrays并在设置HSQLDB时使用Blob。
答案 2 :(得分:0)
同一问题的发生时间比我想承认的要长。最终将其添加到我的测试包和特定于测试的配置文件中:
package com.example.test;
import org.hibernate.dialect.PostgreSQL9Dialect;
import java.sql.Types;
public class PostgreSQLDialectArray extends PostgreSQL9Dialect {
public PostgreSQLDialectArray() {
super();
registerHibernateType(Types.ARRAY, "array");
registerColumnType(Types.ARRAY, "integer[]" );
}
}
spring:
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
dialect: com.example.test.PostgreSQLDialectArray
到目前为止,似乎可以正常运行。