Подтвердить что ты не робот

Как добавить столбец в объект JPA и сохранить мои данные?

Во время разработки приложения JPA я добавил поле "тип" для объекта. Это заставило приложение не запускаться с

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Column 'T1.TYPE' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'T1.TYPE' is not a column in the target table.
Error Code: -1

во время выбора.

Есть ли способ получить его в ALTER TABLE при запуске, чтобы соответствовать текущим определениям сущностей? Я заметил, что когда приложение запускается, он вызывает CREATE TABLE для каждой таблицы, терпит неудачу и продолжает.

В прошлом, когда я добавлял поля к сущностям, я просто удалял базу данных и начинал заново. Это нормально для меня сейчас, но что, если я хочу добавить поле к записи при разработке следующей версии программного обеспечения, как мне обновлять мои клиенты, не теряя при этом все данные?

Спасибо заранее - Фил.

4b9b3361

Ответ 1

Вообще говоря, генераторы базы данных поставщиков JPA не надежны для создания и обновления производственных баз данных. Предположим, что в версии 1 у вас было поле с именем name для вашего объекта User, а в версии 2 вы заменили его на firstName и lastName. В таких случаях генератор базы данных не может правильно выполнить миграцию вашей схемы.

Другими словами, автоматическое создание БД провайдера JPA полезно только для разработки, а не для производства.

Вместо этого вы можете использовать инструмент миграции базы данных, например LiquiBase.

Сказав это, хотя EclipseLink не поддерживает способ обновления, а не воссоздания таблиц с использованием свойства eclipselink.ddl-generation, некоторые другие поставщики JPA (например, Hibernate) поддерживают обновление таблиц базы данных. Тем не менее, они не могут быть использованы для использования в производстве, поскольку они терпят неудачу в таких случаях, как данный пример.

Ответ 2

Вы можете заменить таблицы в EclipseLink, используя

"eclipselink.ddl-generation" = "drop-and-create-tables"

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

Обычно обычно лучше, чтобы DBA определял script для определения производственной схемы и обработки миграции.

Ответ 3

Для справки, если вы сделали то же самое с DataNucleus и указали значение по умолчанию для нового поля (столбец), и у вас было соответствующее свойство устойчивости, чтобы разрешить обновления схемы, тогда он выдаст "ALTER TABLE ADD COLUMN..." и будет хорошо.

Ответ 4

Вы используете его с JSF?

Это очень легко. Модуль persistence (persistence.xml) может отбрасывать и создавать таблицы для вас.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JobbingPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>job</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>