Сопоставление таблицы с именем “group” в режиме Гибернации для DB2 и HSQLDB
-
21-09-2019 - |
Вопрос
У меня есть таблица под названием Группа, что я пытаюсь сопоставить , используя hibernate для DB2 и HSQLDB.Имя таблицы Группа это зарезервированное слово, и оно должно быть заключено в кавычки в 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 (создание групповой таблицы):
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.гибернация.диалект.DB2Диалект и org.гибернация.диалект.HSQLDialect для DB2 и HSQLDB, соответственно.
Как я могу заставить одно и то же сопоставление работать для обеих баз данных одновременно?
Решение
В итоге я сделал create alias groups for group;
в DB2 и изменил имя таблицы в HSQLDB, что решило мою проблему.Теперь я составляю карту Группы таблица, и этой проблемы больше нет.
Другие советы
Использование обратных меток (как в вашем первом примере) должно сработать, но вы должны их использовать повсюду упоминается имя таблицы.
Диалект имеет Открытая цитата() и closeQuote() Закрыть строку() методы, которые переводят эти обратные ссылки в кавычки, подходящие для данной базы данных.Они по умолчанию заключены в двойные кавычки (") для большинства баз данных, включая DB2 и HSQL.Сейчас у меня нет ни того, ни другого, чтобы попробовать это, но в прошлом это работало для комбинации DB2 / Oracle / MySQL.
Можете ли вы опубликовать конкретную ошибку и трассировку стека, которую вы получаете?
Все, что было сказано, если вы может измените имя таблицы на слово, не являющееся зарезервированным, которое я бы настоятельно рекомендовал вам сделать - в конце концов, вы избавите себя от большой головной боли.