Domanda

Ho un progetto che sto costruendo con Maven e devo generare uno schema usando lo strumento HBM2DDL di Hibernate3-Maven-plugin.

Devo creare un database con una tabella chiamata Ordine Come la parola chiave SQL e non so come fare Maven per citare questa tabella quando genera lo script. Ho fatto una ricerca e ho scoperto che c'è una proprietà in letargo per dire lo strumento HBM2DDL a questo, ma non riesco a dire al plugin di usarlo:

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

Se non cito la tabella, HBM2DDL genera uno 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;

Ciò non si compila (a causa di un evidente errore di sintassi):

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

Questa è la parte del file 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>

Qualsiasi consiglio o aiuto è davvero apprezzato.

Grazie!

È stato utile?

Soluzione

Afaik, il hbm2ddl.keywords è una funzionalità di nhibernate e non è supportata da Hibernate.

Con Hibernate, dovrai citare il nome da solo:

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

La sezione pertinente della documentazione è:

5.4. Identificatori citati SQL

È possibile forzare Hibernate a citare un identificatore nel SQL generato racchiudendo la tabella o il nome della colonna nei backticks nel documento di mappatura. Hibernate utilizzerà lo stile di citazione corretto per il dialetto SQL. Di solito si tratta di citazioni doppie, ma SQL Server utilizza parentesi e MySQL utilizza i backtick.

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

Riferimenti

Altri suggerimenti

Un'altra soluzione per il problema è disponibile qui: https://forum.hibernata.org/viewtopic.php?p=2409922

Fondamentalmente, tutto ciò di cui ha bisogno è derivare una classe che è in risposta alla fornitura del nome della tabella/nome della colonna.

Spero che aiuti.

Saluti, Truong

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top