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