Eclipselink обновляет существующие таблицы - PullRequest
25 голосов
/ 31 мая 2010

Возможно, я ошибся, но я думал, что JPA смог обновить существующую таблицу (модель изменилась, добавив столбец), но в моем случае это не работает.

Я вижу в журналах eclipselink, пытающихся создать его, но не удается, потому что он уже существует. Вместо того, чтобы пытаться обновить, чтобы добавить столбец, он продолжает идти.

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

А вот таблица с изменением (добавлен онлайн-столбец)

[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

После этого продолжается следующее.

Я что-то не так делаю или это ошибка?

Ответы [ 4 ]

33 голосов
/ 21 сентября 2012

Начиная с EclipseLink 2.4, вы можете использовать это в спецификации вашей персистентной единицы:

<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
4 голосов
/ 01 июня 2010

Это ожидаемое поведение при использовании значения create-tables. Из документации о недвижимости eclipselink.ddl-generation:

Использование расширений EclipseLink JPA для генерации схемы

Ниже приведены допустимые значения для использование в persistence.xml файле:

  • none - EclipseLink не генерирует DDL; схема не генерируется.
  • create-tables - EclipseLink попытается выполнить CREATE TABLE SQL для каждой таблицы. Если стол уже существует, EclipseLink будет следуйте поведению по умолчанию вашего конкретная база данных и драйвер JDBC комбинация (когда CREATE TABLE SQL выдается за уже существующий Таблица). В большинстве случаев исключение бросили и таблица не создана. Затем EclipseLink продолжит следующее утверждение. (Смотрите также eclipselink.create-ddl-jdbc-file-name.)
  • drop-and-create-tables - EclipseLink попытается DROP все таблицы, затем CREATE все таблицы. Если возникли проблемы, EclipseLink будет следовать по умолчанию поведение вашей конкретной базы данных и Комбинация драйверов JDBC, затем продолжить со следующим утверждением. (Смотрите также eclipselink.create-ddl-jdbc-file-name а также eclipselink.drop-ddl-jdbc-file-name.)

Так что вы можете захотеть drop-and-create-tables вместо.

2 голосов
/ 08 января 2011

Реализация JPA Hibernate делает именно то, что вы хотите. Вот свойство, которое разрешает такое поведение:

property name="hibernate.hbm2ddl.auto" value="update"
1 голос
/ 12 декабря 2012

create-or-exte-tables делает свое дело

...