将持久化实体更改为同级子类

时间:2013-01-25 16:58:37

标签: java hibernate jpa

现在我们将JPA entity定义为:

@Entity
@Table(name="Foo")
public class Foo extends ParentClass {
...
}

想象一下,一些Foo对象已经存在于数据库中。以编程方式将这些持久化记录更改为Bar类型的同级子类的最佳方法是什么?

@Entity
@Table(name="Bar")
public class Bar extends ParentClass {
...
}

我们想要更改数据库架构,只想更改已持久的Foo对象的实体类型。我希望有一种比我想到的唯一更好的方法,即手动抓取Foo个对象,重新映射到Bar,然后重新保持。

1 个答案:

答案 0 :(得分:1)

特别是我更喜欢使用纯SQL迁移。在我的公司中,我们使用liquibase来版本化我们的数据库模式。因此,要进行迁移,我们只需为其创建更改日志。

有些人认为这不是最好的解决方案,但我发现它简单而且非常强大。在我的观察中,对于大型项目来说,这是可行的方法。


编辑:

现在我发现你无法改变架构。我不认为这可以通过编程方式轻松实现。你需要在Foo和Bar之间使用一些“TransformerService”,只需复制公共父字段,删除旧的Foo并保留新的Bar

我要做的是打破层次结构并将ParentClass组件化,因此您只能在FooBar之间进行转移,反之亦然。这样您就不需要复制字段或类似的东西了。它可能需要大量的重构,但组件化比创建大/复杂的层次结构更好。

或者您可以运行直接在数据库中更改对象的SQL。这很难看,但这是我看到你能做到这一点的唯一方式。