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

标签 java hibernate jpa

现在我们有一个 JPA 实体 定义为:

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

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

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

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

最佳答案

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

有些人认为这不是最好的解决方案,但我发现它简单且非常强大。在我看来,对于大型项目来说,这是必经之路。

<小时/>

编辑:

现在我发现您无法更改架构。我认为这不可能以简单的编程方式实现。您需要在 Foo 和 Bar 之间使用某种“TransformerService”,它只需复制公共(public)父字段,删除旧的 Foo 并保留新的 Bar

我要做的就是打破层次结构并组件化 ParentClass,这样您就可以在 FooBar 之间仅传输它,反之亦然。这样您就不需要复制字段或类似的内容。它可能需要大量重构,但组件化比创建大/复杂的层次结构更好。

或者您可以直接运行 SQL 来更改数据库中的对象。这很丑陋,但这是我认为你可以做这样的事情的唯一方法。

关于java - 将持久化实体更改为同级子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526654/

相关文章:

java - Hibernate/JPA + Derby - SELECT 语句在 GROUP BY、ORDER BY 或选择列表中包含太多项目

jpa - 使用JPA的数据库爬虫

java - hibernate : dynamic-update dynamic-insert - Performance Effects

java - 使用 JPA 进行事务管理 : how to perform a rollback if an error occurs at runtime

java - 添加类类型参数而不破坏客户端代码

java - XSS漏洞修复方法

java - 带 Tomcat 的 Eclipse $$EnhancerByCGLIB$$ 'Unable to install breakpoint'

java - 正则表达式不适用于密码

hibernate/JPA : duplicates in child collection

java - JPA中的并发问题