Hibernate / JPA / HSQL: как создать отображение диалекта для типа пользователя ARRAY - PullRequest
1 голос
/ 22 марта 2011

Я успешно создал типы пользователей с 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[].Не уверен, что это даже правильный подход.Возможно, есть какой-то другой способ переопределить процесс создания схемы?

Ответы [ 2 ]

1 голос
/ 09 ноября 2012

Я решил это, работая вокруг него.В этот момент я использовал Hibernate session.doWork (...), чтобы получить соединение JDBC, и сделал это с JDBC: http://docs.oracle.com/javase/tutorial/jdbc/basics/array.html

Подсказка: чтобы определить тип массива (который вы должны сделать при вызове

connection.createArrayOf (TYPENAME, Object [])

) Вы можете обратиться к этому исходному коду для имен разрешенных типов: http://grepcode.com/file/repo1.maven.org/maven2/postgresql/postgresql/9.0-801.jdbc4/org/postgresql/jdbc2/TypeInfoCache.java

(это подсказка из этого ответа: Обновление ResultSets с типами массивов SQL в JDBC / PostgreSQL )

0 голосов
/ 24 марта 2011

Я решил это, работая вокруг него.HSQLDB вообще не поддерживает массивы.Но так как все, что мне нужно сделать, это сериализовать и десериализовать мой массив для моих модульных тестов, я могу просто конвертировать все в BLOB-ы ...

Для этого я просто изменил свои объекты UserType, чтобы они возвращали массив или BLOB-объектв зависимости от того, установлен ли статический глобальный флаг, который по умолчанию использует массивы и использует BLOB-объекты при настройке HSQLDB.

...