Hibernate / JPA / HSQL:如何为用户类型ARRAY创建Dialect映射

时间:2011-03-22 15:09:28

标签: hibernate jpa hsqldb usertype

我已成功使用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[]之间无法正确解析。不确定这是否是正确的方法。也许还有其他方法可以覆盖架构创建过程?

3 个答案:

答案 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

到目前为止,似乎可以正常运行。