¿Cómo puedo citar tablas usando hibernate3-saven-plugin hbm2ddl?
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!
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
- Guía de referencia de hibernación
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