2011-03-22 112 views
1

我已经成功创建了Postgres的用户类型,并且可以成功读取和写入。Hibernate/JPA/HSQL:如何为用户类型创建Dialect映射ARRAY

@ org.hibernate.annotations.Type(类型= “com.xxx.datamodel.ext.FooType”) @Column(名称= “foo” 的,可为空=假) 私人INT []富

@ org.hibernate.annotations.Type(类型= “com.xxx.datamodel.ext.BarType”) @Column(名称= “栏”,可为空=假) 私人双[]栏

然而,当我尝试使用HSQLDialect(对单元测试)时,得到: 引起:org.hibernate.MappingException:否JDBC类型的方言映射:2003 at org.hibernate.dialect.TypeN ames.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) (org.hibernate.tool.hbm2ddl.SchemaExport。(SchemaExport.java:105) at org.hibernate.impl.SessionFactoryImpl。(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多个

2003 java.sql.Types.Array 看起来它试图创建测试之前的模式失败,我不知道如何告诉HSQL创建适当的类型/模式。

我发现了另一个有点相关的职位,建议我延伸HSQLDialect并注册柱类型: ... registerColumnType(Types.ARRAY,FooType.class.getCanonicalName()); registerColumnType(Types.ARRAY,BarType.class.getCanonicalName()); ...

此方法的问题是每个SQL类型只允许有一个映射,并且它在int []和double []之间不能正确解析...不确定这是否是正确的方法。也许有其他方式来重写模式创建过程?

帮助!

+0

PostgreSQL和HSQLDB方言不映射ARRAY类型(也没有我见过的其他方言)。行为改变可能是由于JDBC驱动程序对ARRAY类型支持的报告不同,并且Hibernate期望在驱动程序支持ARRAY类型时查找映射。 – fredt 2011-03-22 16:18:57

+0

混乱的轻微位:Postgres的方言不支持ARRAY,一旦你创建一个用户类型:/ * * (非的Javadoc) * @see org.hibernate.usertype.UserType#returnedClass() */ @Override @SuppressWarnings(“unchecked”) public class returnedClass(){ return Double []。class; } /* * (非的Javadoc) * @see org.hibernate.usertype.UserType#的SQLType() */ @覆盖 公共INT []的SQLType(){ 返回SQL_TYPES; //Types.ARRAY } – user671435 2011-03-22 17:46:32

+0

@ user671435什么是'SQL_TYPES'?尽管Hibernate可以与PostgreSQL数组一起工作,但是在生成模式**的过程中会出现什么问题** – 2014-08-19 11:40:32

回答

0

我通过解决这个问题来解决这个问题。 HSQLDB根本不支持数组。但由于我需要做的就是序列化和反序列化我的阵列的单元测试,我可以将所有东西都转换成BLOB ...

要做到这一点我只是修改我的UserType对象返回一个数组或Blob取决于是否设置了静态全局标志,默认使用数组,并在设置HSQLDB时使用Blob。

+0

HSQLDB完全支持数组,例如'CREATE TABLE T(arr INT ARRAY); INSERT INTO T VALUES ARRAY [1,2,3];'并且支持'PreparedStatement#setArray(int i,java.sql.Array array)'。问题在于与Hibernate的交互,这应该被研究和修复。 – fredt 2011-03-24 00:25:46

+0

我还必须创建一个定制的hibernate Dialect,它扩展了将Sql.ARRAY类型映射到varbinary的HSQLDialect。 – user671435 2011-03-25 20:23:45

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

相关问题