tutorial query namedquery metodos manytoone example español entidad ejemplos ejemplo create actualizar java orm jpa eclipselink

java - query - jpql tutorial español



Eclipselink actualiza las tablas existentes (4)

Tal vez lo entendí mal, pero pensé que JPA podía actualizar una tabla existente (el modelo cambió agregando una columna) pero no funciona 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, continúa.

<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 agregada)

[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 error?


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" />


Este es el comportamiento esperado al usar el valor de create-tables . De la documentación sobre la propiedad eclipselink.ddl-generation :

Uso de extensiones EclipseLink JPA 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 un esquema
  • create-tables - EclipseLink intentará ejecutar un SQL CREATE TABLE para cada tabla. Si la tabla ya existe, EclipseLink seguirá el comportamiento predeterminado de su base de datos específica y la combinación de controladores JDBC (cuando se emite un SQL de CREATE TABLE para una tabla ya existente). En la mayoría de los casos, se lanza una excepción y la tabla no se crea. EclipseLink luego continuará con la siguiente declaración. (Consulte también eclipselink.create-ddl-jdbc-file-name .)
  • drop-and-create-tables - EclipseLink intentará DROP todas las tablas, luego CREATE todas las tablas. Si se encuentran problemas, EclipseLink seguirá el comportamiento predeterminado de su base de datos específica y la combinación de controladores JDBC, luego continuará con la siguiente declaración. (Consulte también eclipselink.create-ddl-jdbc-file-name y eclipselink.drop-ddl-jdbc-file-name ).

Por lo tanto, es posible que desee drop-and-create-tables lugar.


La implementación Hubernate JPA hace exactamente lo que usted desea. Aquí está la propiedad que habilita ese comportamiento:

property name="hibernate.hbm2ddl.auto" value="update"


create-or-extend-tables hace el truco