Похож на 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?! Теперь это неправильно наверняка
Согласно 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"/>
Я бы хотел, чтобы [мой] JPA [провайдер] проверял, существуют ли уже таблицы, и если не создавал их, однако мне не удалось найти значение для свойства выше, которое делает это.
Странно, согласно документации TopLink Essentials о расширении toplink.ddl-generation
, create-table
должен оставить существующую таблицу без изменений:
TopLink JPA Extensions for Schema Generation
Укажите, какой язык дескриптора данных (DDL) действие генерации, которое вы хотите ваши объекты JPA. Чтобы указать DDL цель поколения, см.
toplink.ddl-generation.output-mode
.Допустимые значения:
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
нет
- не генерировать DDL; нет схема сгенерирована.create-tables
- создать DDL для несуществующие таблицы; оставить существующий таблицы без изменений (см. такжеtoplink.create-ddl-jdbc-имя-файла
).drop-and-create-tables
- создать DDL для всех таблиц; отбросить все существующие таблицы (см. такжеtoplink.create-ddl-jdbc-имя-файла
иtoplink.drop-ddl-jdbc-имя-файла
).Если вы используете настойчивость вне контейнер EJB и хотел бы создавать файлы DDL без создания таблицы, дополнительно определяют Java системное свойство
INTERACT_WITH_DB
и установите его значение наfalse
.
Ликвибаза ( http://www.liquibase.org ) хорошо справляется с этим. Чтобы полностью привыкнуть к этому, нужно время, но я думаю, что это того стоит.
Liquibase-way не зависит от того, какой поставщик сохраняемости JPA вы используете. Фактически, он даже не зависит от базы данных.