JPA и toplink создать таблицу, если они еще не существуют? - PullRequest
6 голосов
/ 19 июля 2010

Похоже, 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 ?!Теперь это точно не так

Ответы [ 3 ]

5 голосов
/ 19 июля 2010

Согласно 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"/>
2 голосов
/ 19 июля 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

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

0 голосов
/ 19 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...