Работа с обновлениями схемы при использовании Hibernate - PullRequest
2 голосов
/ 25 марта 2010

Я использую Hibernate в качестве ORM для своего приложения. Я хотел бы знать, есть ли хорошее решение для работы с обновлениями схемы в моем приложении, когда эти обновления выполняются кем-то другим. Например, у меня есть набор файлов hbm.xml и соответствующих классов Java, созданных с использованием инструментов Hibernate. Сейчас в работе все работает нормально, пока не будет обновлена ​​схема БД (таблицы / столбцы могут быть удалены / добавлены). У меня нет (мое приложение не имеет) доступа к этому, как мне справиться с этим с помощью Hibernate?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 25 марта 2010

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

Волшебного решения не существует, вам нужно синхронизировать свои сопоставления со схемой. Итак, у вас есть два варианта:

  1. удалить и воссоздать ваши отображения / классы из схемы ~ или ~
  2. обновите сопоставления / классы вручную, чтобы отразить изменения.

Я бы выбрал второй вариант, он менее навязчив и дает вам больше контроля (без большого взрыва, вы можете сохранить старые методы получения / установки, вы можете отказаться от вещей).

В обоих случаях общение - это ключ, вам нужно работать с людьми, которые вносят изменения (и наоборот).

0 голосов
/ 25 марта 2010

Вот как я решу вашу проблему

Я работаю с устаревшей системой (Oracle) , где от нее зависят другие системы . Чтобы использовать его, администратор базы данных (не я) создает ссылку на базу данных с правами доступа только для чтения. Поэтому, если мне нужно создать новую сущность для новой системы, не повреждая (и не беспокоясь) базу данных, которая построена поверх нашей унаследованной системы, я делаю следующее:

Предположим, здесь идет наше наследие класс

@Entity
public class LegacySystemClass {

    private Integer id;

    /**
     * I have read-only access privilege
     * So insertable=false, updatable=false
     */
    @Id
    @Column(name="LEGACY_SYSTEM_ID", insertable=false, updatable=false)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

И мне нужно создать класс для новой Системы, который зависит от LegacyClass

@Entity
public class NewSystemClass {

    private Integer id;
    private LegacySystemClass legacySystemClass;

    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name="LEGACY_SYSTEM_ID")
    public LegacySystemClass getLegacySystemClass() {
        return legacySystemClass;
    }

    public void setLegacySystemClass(LegacySystemClass legacySystemClass) {
        this.legacySystemClass = legacySystemClass;
    }

}

Теперь я генерирую файл SQL в соответствии с

AnnotationConfiguration configuration = new AnnotationConfiguration();

configuration
    .addAnnotatedClass(NewSystemClass.class)
    .addAnnotatedClass(LegacyClass.class)
    .setProperty(Environment.DIALECT, <TYPE_YOUR_DIALECT>)
    .setProperty(Environment.DRIVER, <TYPE_YOUR_DRIVER>);

SchemaExport schema = new SchemaExport(configuration);
schema.setOutputFile("schema.sql");

/*
schema.create(<DO_YOU_WANT_TO_PRINT_TO_THE_CONSOLE>, <DO_YOU_WANT_TO_EXPORT_THE_SCRIPT_TO_THE_DATABASE>);
*/

/**
  * Make sure set up second parameter as false
  * See above
  */
schema.create(true, false);

Будет сгенерирован файл с именем schema.sql, который содержит

create table LegacySystemClass (LEGACY_SYSTEM_ID integer not null, primary key (LEGACY_SYSTEM_ID))

create table NewSystemClass (id integer not null, LEGACY_SYSTEM_ID integer, primary key (id))

alter table NewSystemClass add index FK8533D2E95B9B5D88 (LEGACY_SYSTEM_ID), add constraint FK8533D2E95B9B5D88 foreign key (LEGACY_SYSTEM_ID) references LegacySystemClass 

Я извлекаю любой SQL, связанный с нашей устаревшей системой , такой как LegacyClass. Наша окончательная схема.sql показана следующим образом

create table NewSystemClass (id integer not null, LEGACY_SYSTEM_ID integer, primary key (id))

alter table NewSystemClass add index FK8533D2E95B9B5D88 (LEGACY_SYSTEM_ID), add constraint FK8533D2E95B9B5D88 foreign key (LEGACY_SYSTEM_ID) references LegacySystemClass (LEGACY_SYSTEM_ID)

Я иду в комнату DBA и спрашиваю его

Можете ли вы запустить этот файл schema.sql для меня, пожалуйста ???

Но, как сказал @Pascal Thivent

Коммуникация - это ключ (Принцип экстремального программирования - XP)

0 голосов
/ 25 марта 2010

Я всегда предпочитал наоборот - вносить изменения только в классы и установить hibernate.hbm2ddl.auto на update. Таким образом, база данных будет обновляться на основе ваших классов. Это имеет большой смысл, потому что ваши объекты являются центром вашего приложения, а не их представлением в базе данных.

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