2012-01-03 3 views
9

estoy usando la opción de crear soltar para el desarrollo, al implementar la base de datos MySQL (usando Hibernate 4) consigo el siguiente resultado:hibernate y mysql con la opción de crear y soltar, la salida de la consola muestra el error ... pero ddl se ejecuta correctamente; posible error?

15:18:07,715 ERROR SchemaExport:426 - HHH000389: Unsuccessful: alter table my_table drop foreign key FKD42DEFE312AC02F1 
15:18:07,715 ERROR SchemaExport:427 - Table 'my_db.my_table' doesn't exist 

Parece su intento de modificar una tabla antes de que lo ha creado. La mesa y FK se crearon con éxito. ¿Qué causa el mensaje de error?

Respuesta

4

El problema es que:

  • si tiene dos cuadros A y B y una referencia de clave externa en A que hace referencia a B.
  • y que desea borrar las tablas

Primero debe eliminar la restricción de clave externa. (excepto que conoce la secuencia correcta y no tiene dependencias circulares)

Por lo tanto, normalmente elimina todas las restricciones primero y luego suelta las tablas.

Si una tabla no existe (porque es nueva), entonces usa drop table if exists Pero desafortunadamente my-sql como ninguna declaración para eliminar una forainkey solo si la tabla existe. Por lo tanto, es más una falta de características que un error.


Lo resolví, pero mi configuración es diferente. Utilizo hibernación solo en modo de validación y ejecuto las secuencias de comandos para actualizar la base de datos a mano. Las secuencias de comandos se generan por hibernación org.hibernate.tool.hbm2ddl.SchemaExport. Luego tomo el archivo generado, agregué set foreign_key_checks = 0; al principio y set foreign_key_checks = 1; al final. Entonces le comenté a cabo (-- añadir al comienzo) cada línea que coincide con el patrón de alter table *. drop foreign key *.;

@see https://stackoverflow.com/a/34038447/280244 para más detalles

+0

¿Puedo saber dónde se encuentra el script 'SchemaExport'? –

+0

@Disp Hay; 'SchemaExport' es de' hibernate-core-4.3.11, jar', pero no es un script, es una clase de Java. – Ralph

+0

@Disp Haz: vea mi respuesta a su pregunta: http://stackoverflow.com/a/34038447/280244 – Ralph

0

Cuando yo estaba haciendo esto, yo estaba usando postgres como mi base de datos, y esto es una solución fácil Lo que está sucediendo es que estas tablas se están recreando cada vez, y todo lo que estaba en esa tabla se borra. Para solucionarlo, entra en tu persistence.xml bajo src// recursos/META-INF principal hay dentro de la persistence.xml comentar la línea que

<property name="hibernate.hbm2ddl.auto" value="create"/>

Esa línea recrea todas las tablas con el mismo extranjera clave cada vez que caerá y volverá a crear todas sus tablas (todos sus datos dentro de la base de datos se perderán) cada vez que reinicie su servidor tomcat/jetty. Si lo comenta, evitará que vuelva a crear la base de datos y los datos allí permanecerán.

http://static.springsource.org/spring-roo/reference/html/base-persistence.html

Cuestiones relacionadas