JPA и таблица создания верхней ссылки включены, если они еще не существуют?

Похоже, jpa — это то, что заставляет меня задавать много вопросов.

Добавив это

<property name="toplink.ddl-generation" value="create-tables"/>

мое приложение JPA всегда создает таблицы при запуске, что приводит к исключениям, если таблицы уже существуют. Я хотел бы, чтобы JPA проверял, существуют ли уже таблицы, и если не создавал их, однако я не смог найти значение для свойства выше, которое делает это.

Итак, если я просто отключу его, есть ли способ вручную указать JPA в какой-то момент создать все таблицы?

Обновить вот исключение, которое я получаю

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'tags' already exists
Error Code: 1050
Call: CREATE TABLE tags (ID BIGINT AUTO_INCREMENT NOT NULL, NAME VARCHAR(255), OCCURRENCE INTEGER, PRIMARY KEY (ID))

MySQLSyntaxErrorException?! Теперь это неправильно точно


person Nils    schedule 19.07.2010    source источник
comment
Итак, вы в конечном итоге просто проигнорировали напечатанные исключения или сделали обходной путь.   -  person simgineer    schedule 13.09.2012
comment
Посмотрите на то время, когда я задал этот вопрос. Одним из способов обойти это, вероятно, было бы просто расширить скрипт сборки, чтобы удалить таблицы перед сборкой/развертыванием.   -  person Nils    schedule 13.09.2012


Ответы (3)


Согласно http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#Java2DBSchemaGen toplink не имеет возможности обновлять существующие таблицы, я не уверен, что могу доверять это сделать правильно в любом случае. Вы можете настроить toplink для создания сценария sql, который вам затем придется выполнять вручную для создания всех таблиц. Имена файлов и расположение можно настроить следующим образом:

<property name="toplink.ddl-generation" value="create-tables"/>
<property name="toplink.ddl-generation.output-mode" value="sql-script"/>
<property name="toplink.create-ddl-jdbc-file-name" value="createDDL.sql"/>
<property name="toplink.drop-ddl-jdbc-file-name" value="dropDDL.sql"/>
<property name="toplink.application-location" value="/tmp"/>
person Jörn Horstmann    schedule 19.07.2010

Я хотел бы, чтобы [мой] JPA [поставщик] проверял, существуют ли уже таблицы, и если не создавал их, однако я не смог найти значение для свойства выше, которое делает это.

Странно, согласно документации TopLink Essentials о расширении toplink.ddl-generation, create-table должно оставить существующую таблицу без изменений:

Расширения TopLink JPA для создания схем

Укажите, какое действие генерации языка дескрипторов данных (DDL) вы хотите для своих объектов JPA. Чтобы указать цель генерации DDL, см. toplink.ddl-generation.output-mode.

Действительные значения: oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider

  • none - не генерировать DDL; схема не создается.
  • create-tables - создать DDL для несуществующих таблиц; оставить существующие таблицы без изменений (см. также toplink.create-ddl-jdbc-file-name).
  • drop-and-create-tables - создать DDL для всех таблиц; удалить все существующие таблицы (см. также toplink.create-ddl-jdbc-file-name и toplink.drop-ddl-jdbc-file-name).

Если вы используете сохраняемость вне контейнера EJB и хотите создавать файлы DDL без создания таблиц, дополнительно определите системное свойство Java INTERACT_WITH_DB и установите для него значение false.

person Pascal Thivent    schedule 19.07.2010
comment
Я не использую здесь EJB (и даже не сервер приложений). Я просто заметил некоторые исключения при его запуске и с уже существующей базой данных, но спасибо за указание на это. - person Nils; 20.07.2010
comment
@Nils: я не уверен, что понял твой комментарий. Вышеизложенное применимо и при использовании TopLink Essentials в качестве поставщика JPA в среде Java SE, и я думаю, что вы неправильно прочитали последнее предложение документации. Этот ответ строго охватывает ваш вопрос здесь (который не касался обновления существующих таблиц). - person Pascal Thivent; 20.07.2010

Liquibase (http://www.liquibase.org) отлично справляется с этой задачей. Требуется некоторое время, чтобы полностью привыкнуть к нему, но я думаю, что оно того стоит.

Способ Liquibase не зависит от того, какой поставщик сохраняемости JPA вы используете. На самом деле, это даже не зависит от базы данных.

person Jan    schedule 19.07.2010