Pergunta

Tenho um projeto que estou construindo com o Maven e preciso gerar um esquema usando a ferramenta HBM2DDL da Hibernate3-Maven-Plugin.

Eu preciso criar um banco de dados com uma tabela chamada Ordem Como a palavra -chave SQL e eu não sei como fazer do Maven citar esta tabela quando ela está gerando o script. Fiz uma pesquisa e descobri que há uma propriedade em Hibernate para informar a ferramenta HBM2DDL para isso, mas não posso dizer ao plugin para usá -lo:

<property name="hbm2ddl.keywords">auto-quote</property>

Se eu não citar a tabela, o HBM2DDL gera um script:

create table Order (orderId varchar(36) not null, orderCode integer, customer varchar(36) not null, supplier varchar(36) not null, product varchar(36) not null, forecast float, dateRaised date not null, dateDispatched date, dateReceived date, quantityOrdered double precision not null, quantitySent double precision, primary key (orderId)) ENGINE=InnoDB;

Isso não compila (devido a um erro óbvio de sintaxe):

02:51:41,264 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Unsuccessful: create table Order (orderId varchar(36) not null, orderCode integer, customer varchar(36) not null, supplier varchar(36) not null, product varchar(36) not null, forecast float, dateRaised date not null, dateDispatched date, dateReceived date, quantityOrdered double precision not null, quantitySent double precision, primary key (orderId)) ENGINE=InnoDB
02:51:41,264 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order (orderId varchar(36) not null, orderCode integer, customer varchar(36) not' at line 1

Esta é a parte do arquivo pom.xml:

<configuration>
 <components>
  <component>
   <name>hbm2java</name>
   <implementation>annotationconfiguration</implementation>
   <outputDirectory>src/main/java</outputDirectory>
  </component>
  <component>
   <name>hbm2ddl</name>
   <implementation>annotationconfiguration</implementation>
   <outputDirectory>src/main/resources</outputDirectory>
  </component>
  <component>
   <name>hbm2doc</name>
   <implementation>annotationconfiguration</implementation>
   <outputDirectory>docs/html/hibernate</outputDirectory>
  </component>
 </components>
 <componentProperties>
  <create>true</create>
  <drop>true</drop>
  <configurationfile>src/main/resources/hibernate.cfg.xml</configurationfile>
  <propertyfile>src/main/resources/database.properties</propertyfile>
  <jdk5>true</jdk5>
  <outputfilename>amasbe_db.sql</outputfilename>
 </componentProperties>
</configuration>

Qualquer dica ou ajuda é realmente apreciada.

Obrigada!

Foi útil?

Solução

Afaik, o hbm2ddl.keywords é um recurso Nibernate e não é suportado pelo hibernado.

Com o Hibernate, você terá que citar o nome:

@Entity
@Table(name="`Order`")
public class Order {
    ...
}

A seção relevante da documentação é:

5.4. Identificadores citados pelo SQL

Você pode forçar o Hibernate a citar um identificador no SQL gerado, envolvendo o nome da tabela ou coluna em backticks no documento de mapeamento. O Hibernate usará o estilo de cotação correto para o dialeto SQL. Geralmente, são cotações duplas, mas o servidor SQL usa colchetes e o MySQL usa backsticks.

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

Referências

Outras dicas

Outra solução para o problema pode ser encontrada aqui: https://forum.hibernate.org/viewtopic.php?p=2409922

Basicamente, tudo o que precisa é derivar uma classe que é uma resposta para fornecer o nome da tabela/nome da coluna.

Espero que ajude.

Saúde, Truong

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