Eclipselink actualizar tablas existentes


Tal vez me equivoqué, pero pensé que JPA fue capaz de actualizar una tabla existente (el modelo cambió agregando una columna), pero no está funcionando en mi caso.

Puedo ver en los registros eclipselink intentando crearlo pero fallando porque ya existe. En lugar de intentar una actualización para agregar la columna, sigue adelante.

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jwrestling"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
<property name="eclipselink.logging.level" value="INFO"/>

Y aquí está la tabla con el cambio (columna en línea añadida)

[EL Warning]: 2010-05-31 14:39:06.044--ServerSession(16053322)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'account' already exists
Error Code: 1050
Call: CREATE TABLE account (ID INTEGER NOT NULL, USERNAME VARCHAR(32) NOT NULL, SECURITY_KEY VARCHAR(255) NOT NULL, EMAIL VARCHAR(64) NOT NULL, STATUS VARCHAR(8) NOT NULL, TIMEDATE DATETIME NOT NULL, PASSWORD VARCHAR(255) NOT NULL, ONLINE TINYINT(1) default 0 NOT NULL, PRIMARY KEY (ID))
Query: DataModifyQuery(sql="CREATE TABLE account (ID INTEGER NOT NULL, USERNAME VARCHAR(32) NOT NULL, SECURITY_KEY VARCHAR(255) NOT NULL, EMAIL VARCHAR(64) NOT NULL, STATUS VARCHAR(8) NOT NULL, TIMEDATE DATETIME NOT NULL, PASSWORD VARCHAR(255) NOT NULL, ONLINE TINYINT(1) default 0 NOT NULL, PRIMARY KEY (ID))")
[EL Warning]: 2010-05-31 14:39:06.074--ServerSession(16053322)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions.DatabaseException

Después de esto continúa con lo siguiente.

Estoy haciendo algo mal ¿o es un insecto?

Author: Pascal Thivent, 2010-05-31

4 answers

A partir de EclipseLink 2.4, puede usar esto en la especificación de su unidad de persistencia:

<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
 33
Author: Jean-Philippe Pellet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-21 10:20:20

Este es el comportamiento esperado cuando se usa el valor create-tables. De la documentación sobre la propiedad eclipselink.ddl-generation:

Uso de extensiones JPA de EclipseLink para la Generación de Esquemas

Los siguientes son los valores válidos para el uso en un archivo persistence.xml:

  • none – EclipseLink no genera DDL; no se genera ningún esquema.
  • create-tables - EclipseLink intentará ejecutar un CREATE TABLE SQL para cada tabla. Si la tabla ya existe, EclipseLink lo hará siga el comportamiento predeterminado de su base de datos específica y controlador JDBC combinación (cuando un CREATE TABLE SQL se emite para un ya existente tabla). En la mayoría de los casos una excepción es lanzado y la mesa no se crea. EclipseLink continuará con la siguiente declaración. (Véase también eclipselink.create-ddl-jdbc-file-name.)
  • drop-and-create-tables – EclipseLink intentará DROP todos tablas, luego CREATE todas las tablas. Si cualquier problema se encuentra, EclipseLink seguirá el predeterminado comportamiento de su base de datos específica y Combinación de controladores JDBC, luego continuar con la siguiente declaración. (Véase también eclipselink.create-ddl-jdbc-file-name y eclipselink.drop-ddl-jdbc-file-name.)

Así que podrías querer drop-and-create-tables en su lugar.

 4
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-31 22:18:24

La implementación de Hibernate JPA hace exactamente lo que quieres. Aquí está la propiedad que habilita ese comportamiento:

property name="hibernate.hbm2ddl.auto" value="update"
 2
Author: joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-17 19:00:36

Crear o extender tablas hace el truco

 1
Author: Hamdi Baligh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-12 02:28:08