我有一张桌子叫 团体, ,我正在尝试使用 hibernate for DB2 进行映射,并且 HSQL数据库. 。表名 团体 是保留字,在 HSQLDB 中必须用引号引起来。然而,DB2 不喜欢带引号的表名。

所以这个映射在 HSQLDB 中有效,但在 DB2 中无效:

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

映射会导致 DB2 中出现以下错误(进行涉及 Group 表的查询):

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.hibernate.dialect.DB2Dialectorg.hibernate.dialect.HSQLDialect 分别适用于 DB2 和 HSQLDB。

如何使相同的映射同时适用于两个数据库?

有帮助吗?

解决方案

我结束了在DB2做create alias groups for group;和HSQLDB,它解决了我的问题,改变表名。现在我映射的的表,不再有这个问题。

其他提示

使用反引号(就像在您的第一个示例中一样)应该可以工作,但您必须使用它们 到处 提到了表名。

方言打开报价()关闭引用() 将这些反引号转换为适合给定数据库的引号的方法。对于大多数数据库(包括 DB2 和 HSQL),它们默认使用双引号 (")。我现在手头上没有任何东西可以尝试这个,但我过去已经让它适用于 DB2 / Oracle / MySQL 组合。

您可以发布具体的错误和您收到的堆栈跟踪吗?

说了这么多,如果你 将表名更改为非保留字我强烈建议您这样做 - 最终您会省去很多麻烦。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top