Ответ 1
Как и в EclipseLink 2.4, вы можете использовать это в спецификации своей единицы персистентности:
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
Возможно, я ошибался, но, хотя 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
После этого он продолжается со следующим.
Я делаю что-то неправильно или это ошибка?
Как и в EclipseLink 2.4, вы можете использовать это в спецификации своей единицы персистентности:
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
Это ожидаемое поведение при использовании значения create-tables
. Из документации о свойстве eclipselink.ddl-generation
:
Использование расширений EclipseLink JPA для генерации схемы
Ниже приведены допустимые значения для использование в файле
persistence.xml
:
none
- EclipseLink не генерирует DDL; никакая схема не генерируется.create-tables
- EclipseLink попытается выполнить командуCREATE TABLE
SQL для каждой таблицы. Если таблица уже существует, EclipseLink будет следуйте поведению вашего конкретная база данных и драйвер JDBC комбинация (когда aCREATE 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
.
Выполнение Hibernate JPA делает именно то, что вы хотите. Вот свойство, которое позволяет это поведение:
property name="hibernate.hbm2ddl.auto" value="update"
create-or-extend-tables делает трюк