java - Hibernate在JOINED继承中将对象从父类升级到子类

标签 java spring hibernate jpa spring-data-jpa

我在我的项目中使用 Spring Data JpaHibernate

我有三个表:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
class Parent {
   String id;
   String name;
}

@Entity
class FirstChild extends Parent {
   ...
}

@Entity
class SecondChild extends Parent {
   ...
}

在我的逻辑的第一步中,我应该保存没有子类型的父对象。 在第二步中,我知道它应该属于哪个 Child 表。

例如:

Parent parent = parentRepository.findById("id");

FirstChild firstChild = new FirstChild();
firstChild.setId(parent.getId());
firstChild.setName(parent.getName());

parentRepository.save(firstChild);

但是当我执行 Hibernate save 时,它会抛出异常:

o.h.e.i.DefaultLoadEventListener Load request found matching entity in context, but the matched entity was of an inconsistent return type; returning null

据我了解,它不知道如何将entity从父类型升级为子类型,并且只是由于冲突而引发异常 - 具有相同id的实体已经存在.

这个问题有解决办法吗?

最佳答案

JPA 是将 Java 域模型映射到关系数据库模式的一种方法。由于Java中没有“将父类提升为子类”这样的东西,因此JPA中不支持此类操作。

话虽这么说,您可能可以使用 native 更新查询实现所需的行为。您需要更新鉴别器列 (DTYPE) 列,并将新行插入到与子实体对应的表中(请注意,在 SINGLE_TABLE 策略中,更新鉴别器列就足够了)。

恕我直言,更好的解决方案是删除父实体并插入新的子实体。如果您担心引用完整性,也许您应该从继承切换到组合

关于java - Hibernate在JOINED继承中将对象从父类升级到子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46325473/

相关文章:

java - 从主类或启动监听器运行临时 Spring Boot 应用程序?

java - 将 void 方法的内容保存到变量

java - Java 中的字符串修剪

spring - Kafka 监听器的 Swagger 文档

java - Hibernate 字节码增强单向 ManyToOne

java - JPA Hibernate Lazy 多对一获取代理

java - JPA事务不回滚

java - 我想在用户使用我的应用程序之前执行登录

java邮件smtp连接问题

java - Spring 中具有两个 id 的同一实例