Отображение таблицы под названием group в Hibernate для DB2 и HSQLDB

У меня есть таблица с названием group, которую я пытаюсь сопоставить с помощью спящего режима для DB2 и HSQLDB. Имя таблицы group - зарезервированное слово и должно быть заключено в кавычки в HSQLDB. Однако DB2 не любит имя таблицы в кавычках.

Таким образом, это отображение работает в HSQLDB, но не в DB2:

@Entity
@Table(name="`group`")
public class Group {

Отображение приводит к следующей ошибке в DB2 (выполнение запроса с использованием таблицы групп):

Caused by: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -204, SQLSTATE: 42704, SQLERRMC: SCHEMA_NAME.group
    at com.ibm.db2.jcc.b.hh.c(hh.java:1662)
    at com.ibm.db2.jcc.b.hh.d(hh.java:1650)
    at com.ibm.db2.jcc.b.hh.a(hh.java:1219)
    at com.ibm.db2.jcc.c.db.g(db.java:139)
    at com.ibm.db2.jcc.c.db.a(db.java:39)
    at com.ibm.db2.jcc.c.t.a(t.java:34)
    at com.ibm.db2.jcc.c.sb.f(sb.java:142)
    at com.ibm.db2.jcc.b.hh.n(hh.java:1190)
    at com.ibm.db2.jcc.b.ih.eb(ih.java:1997)
    at com.ibm.db2.jcc.b.ih.d(ih.java:2439)
    at com.ibm.db2.jcc.b.ih.V(ih.java:492)
    at com.ibm.db2.jcc.b.ih.executeQuery(ih.java:475)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
    at org.hibernate.loader.Loader.doQuery(Loader.java:674)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
    ... 71 more

И это работает в DB2, но не в HSQLDB:

@Entity
@Table(name="group")
public class Group {

Отображение приводит к следующей ошибке в HSQLDB (создание таблицы Group):

WARN hibernate.ExtendedAnnotatedSessionFactoryBean - Unsuccessful schema statement: create table group  ( *details omitted* )
java.sql.SQLException: Unexpected token: GROUP in statement [create table group]
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaStatement(LocalSessionFactoryBean.java:1000)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaScript(LocalSessionFactoryBean.java:972)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean$2.doInHibernate(LocalSessionFactoryBean.java:912)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.createDatabaseSchema(LocalSessionFactoryBean.java:906)
  ...

Я использую org.hibernate.dialect.DB2Dialect и org.hibernate.dialect.HSQLDialect для DB2 и HSQLDB соответственно.

Как сделать так, чтобы одно и то же сопоставление работало для обеих баз данных одновременно?


person Juha Syrjälä    schedule 14.10.2009    source источник
comment
Использование ключевого слова SQL - не лучшая идея. Если возможно, выберите другое имя таблицы.   -  person Arthur Ronald    schedule 14.10.2009
comment
Первая опубликованная вами трассировка стека предполагает, что имя вашей таблицы не экранируется везде - в частности, есть сопоставленная вами коллекция, которая по-прежнему относится к имени таблицы без экранирования. Ожидается вторая трассировка стека - недопустимое имя «группа» без экранирования. Немного озадачивает то, что он работает в DB2 - я предполагаю, что его настройки были изменены, и теперь он использует другой escape-символ. Вам нужно выяснить, что это такое, и переопределить диалект, чтобы указать его в методах openQuote / closeQuote, как я указал в своем ответе.   -  person ChssPly76    schedule 14.10.2009


Ответы (2)


В итоге я сделал create alias groups for group; в DB2 и изменил имя таблицы в HSQLDB, что решило мою проблему. Теперь я отображаю таблицу groups, и этой проблемы больше нет.

person Juha Syrjälä    schedule 14.10.2009

Использование обратных кавычек (как в первом примере) должно работать, но вы должны использовать их везде, где упоминается имя таблицы.

Диалект имеет openQuote () и closeQuote () методы, которые переводят эти обратные кавычки в кавычки подходит для данной базы данных. По умолчанию используются двойные кавычки (") для большинства баз данных, включая DB2 и HSQL. У меня сейчас нет ни того, ни другого, чтобы попробовать это, но у меня это уже работало для комбинации DB2 / Oracle / MySQL в прошлом.

Можете ли вы опубликовать конкретную ошибку и полученную трассировку стека?

С учетом всего вышесказанного, если вы можете изменить имя таблицы на незарезервированное слово, я настоятельно рекомендую вам это сделать - в конечном итоге вы избавите себя от много головной боли.

person ChssPly76    schedule 14.10.2009
comment
Я выложил несколько трассировок стека. К сожалению, я не могу переименовать таблицу. - person Juha Syrjälä; 14.10.2009
comment
Похоже, что DB2 не любит цитирование с помощью -символов: db2 = ›select * from group SQL0204N SCHEMA_NAME.group - это неопределенное имя. SQLSTATE = 42704 - person Juha Syrjälä; 14.10.2009