使用Hibernate时处理模式升级

时间:2010-03-24 22:21:03

标签: java hibernate orm

我正在使用Hibernate作为我的应用程序的ORM。我想知道当这些升级由其他人完成时,是否有一个很好的解决方案来处理我的应用程序中的模式升级。例如,我有一组hbm.xml文件和使用Hibernate工具生成的相应java类。现在正在生产中,一切正常,直到db模式升级(表/列可能被删除/添加)。我不(我的应用程序没有)可以访问这样做,所以如何使用Hibernate处理这个?

谢谢!

3 个答案:

答案 0 :(得分:4)

  

我想知道,当这些升级由其他人完成时,是否有一个很好的解决方案来处理应用程序中的架构升级。

没有神奇的解决方案,您需要使映射与架构保持同步。所以你有两个选择:

  1. 从架构〜或〜
  2. 中删除并重新创建映射/类
  3. 手动更新您的映射/类以反映更改。
  4. 我会选择第二个选项,它不那么具有侵入性,可以让你获得更多控制权(没有大爆炸,你可以保留旧的getter / setter,你可以弃用东西)。

    在这两种情况下,沟通都是关键,你需要与进行变革的人合作(反之亦然)。

答案 1 :(得分:0)

我总是喜欢反过来 - 只对类进行更改并将hibernate.hbm2ddl.auto设置为update。这样,数据库将根据您的类进行更新。这很有意义,因为您的对象是应用程序的中心,而不是数据库表示。

答案 2 :(得分:0)

以下是我如何解决您的问题

我使用遗留系统(Oracle),其他系统依赖它。为了使用它,DBA(不是我)创建具有只读访问权限的数据库链接。因此,如果我需要为新系统创建一个新实体而不损坏(并担心)构建在我们遗留系统之上的数据库,我会按照以下步骤进行操作

假设这里是我们的遗产

@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。我们的最终schema.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)