3

私はgroupというテーブルを持っており、DB2とHSQLDBのhibernateを使用してマップしようとしています。テーブル名グループは予約語であり、HSQLDBで引用符で囲む必要があります。ただし、DB2は引用符で囲まれたテーブル名を好みません。

したがって、このマッピングはHSQLDBでは機能しますが、DB2では機能しません。

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

マッピングの結果、DB2で次のエラーが発生します(グループテーブルを含むクエリを作成します)。

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

そして、これはDB2では機能しますが、HSQLDBでは機能しません。

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

マッピングすると、HSQLDBで次のエラーが発生します(グループテーブルの作成)。

警告hibernate.ExtendedAnnotatedSessionFactoryBean-失敗したスキーマステートメント:テーブルグループの作成(*詳細は省略*)
java.sql.SQLException:予期しないトークン:ステートメント内のGROUP[テーブルグループの作成]
    org.hsqldb.jdbc.Util.sqlException(不明なソース)で
    org.hsqldb.jdbc.jdbcStatement.fetchResult(不明なソース)で
    org.hsqldb.jdbc.jdbcStatement.executeUpdate(不明なソース)
    org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaStatement(LocalSessionFactoryBean.java:1000)で
    org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaScript(LocalSessionFactoryBean.java:972)で
    org.springframework.orm.hibernate3.LocalSessionFactoryBean $ 2.doInHibernate(LocalSessionFactoryBean.java:912)で
    org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)で
    org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338)で
    org.springframework.orm.hibernate3.LocalSessionFactoryBean.createDatabaseSchema(LocalSessionFactoryBean.java:906)で
  ..。

DB2とHSQLDBには、それぞれorg.hibernate.dialect.DB2Dialectorg.hibernate.dialect.HSQLDialectを使用しています。

両方のデータベースで同じマッピングを同時に機能させるにはどうすればよいですか?

4

2 に答える 2

2

最終create alias groups for group;的にDB2で実行し、HSQLDBでテーブル名を変更したところ、問題は解決しました。これでグループテーブルをマップしましたが、この問題はもうありません。

于 2009-10-14T11:46:47.700 に答える
0

バックティックの使用(最初のサンプルのように)は機能するはずですが、テーブル名が記載されているすべての場所でバックティックを使用する必要があります。

DialectにはopenQuote( )メソッドとcloseQuote()メソッドがあり、これらのバッククォートを特定のデータベースに適した引用符に変換します。DB2やHSQLを含むほとんどのデータベースでは、デフォルトで二重引用符( ")が使用されます。現在、これを試すためのどちらも手元にありませんが、過去にDB2 / Oracle/MySQLの組み合わせで機能していました。

特定のエラーと取得しているスタックトレースを投稿できますか?

とはいえ、テーブル名を予約されていない単語に変更できる場合は、そうすることを強くお勧めします。最終的には、多くの頭痛の種を減らすことができます。

于 2009-10-14T06:26:40.480 に答える