Pergunta

Eu tenho uma mesa chamada grupo, que estou tentando mapear usando o Hibernate para DB2 e HSQLDB. Nome da tabela grupo é uma palavra reservada e deve ser citado no HSQLDB. No entanto, o DB2 não gosta do nome da tabela citada.

Portanto, esse mapeamento funciona no HSQLDB, mas não no DB2:

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

O mapeamento resulta no seguinte erro no DB2 (fazendo uma consulta que envolve a tabela de grupo):

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

E isso funciona no DB2, mas não no HSQLDB:

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

O mapeamento resulta no seguinte erro no HSQLDB (criando a tabela de grupo):

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)
  ...

estou usando org.hibernate.dialect.db2dialect e org.hibernate.dialect.hsqldialect para DB2 e HSQLDB, respectivamente.

Como posso fazer o mesmo mapeamento funcionar para os dois bancos de dados simultaneamente?

Foi útil?

Solução

Acabei fazendo create alias groups for group; no DB2 e no nome da tabela de alterações no HSQLDB, que resolveu meu problema. Agora eu mapeado grupos Tabela, e não há mais esse problema.

Outras dicas

Usando backsticks (como em sua primeira amostra) deve funcionar, mas você precisa usá -los em toda parte O nome da tabela é mencionado.

Dialeto tem OpenQuote () e CloseQuote () Métodos que traduzem esses backticks em cotações apropriadas para o determinado banco de dados. Aqueles padrão para cotar dobrar (") para a maioria dos bancos de dados, incluindo DB2 e HSQL. Eu não tenho ou não há agora para experimentar isso, mas eu o trabalhei trabalhando para a combinação DB2 / Oracle / MySQL no passado.

Você pode postar um erro específico e o rastreamento da pilha que está recebendo?

Tudo isso dito, se você posso Altere o nome da tabela para uma palavra não reservada que eu recomendo fortemente que você faça - você economizará muita dor de cabeça no final.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top