Pregunta

Tengo un proyecto que estoy construyendo con Maven y necesito generar un esquema utilizando la herramienta HBM2DDL de Hibernate3-Maven-Plugin.

Necesito crear una base de datos con una tabla llamada Ordenar Al igual que la palabra clave SQL y no sé cómo hacer que Maven cita esta tabla cuando genere el script. He hecho una búsqueda y descubrí que hay una propiedad en Hibernate para decirle a la herramienta HBM2DDL, pero no puedo decirle al complemento que lo use:

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

Si no cito la tabla, HBM2DDL genera un 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;

que no se compila (debido a un error de sintaxis obvio):

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 es la parte del archivo 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>

Cualquier consejo o ayuda es realmente apreciada.

¡Gracias!

¿Fue útil?

Solución

Afaik, el hbm2ddl.keywords es una característica nhibernada y no es compatible con Hibernate.

Con Hibernate, tendrás que citar el nombre tú mismo:

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

La sección relevante de la documentación es:

5.4. Identificadores citados de SQL

Puede forzar a Hibernate a citar un identificador en el SQL generado encerrando la tabla o el nombre de la columna en Backticks en el documento de mapeo. Hibernate utilizará el estilo de cita correcto para el dialecto SQL. Esto suele ser cotizaciones dobles, pero el servidor SQL usa soportes y MySQL usa backticks.

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

Referencias

Otros consejos

Aquí se puede encontrar otra solución para el problema: https://forum.hibernate.org/viewtopic.php?p=2409922

Básicamente, todo lo que necesita es derivar una clase que esté en respuesta para proporcionar el nombre de la tabla/nombre de la columna.

Espero que ayude.

Salud, Truong

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top