Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate在联接继承中将对象从父类升级到子类_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java Hibernate在联接继承中将对象从父类升级到子类

Java Hibernate在联接继承中将对象从父类升级到子类,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我正在项目中使用Spring数据Jpa和Hibernate 我有三张桌子: @Entity @Inheritance(strategy = InheritanceType.JOINED) class Parent { String id; String name; } @Entity class FirstChild extends Parent { ... } @Entity class SecondChild extends Parent { ... } 在逻辑

我正在项目中使用
Spring数据Jpa
Hibernate

我有三张桌子:

@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
保存时,它会引发异常:

o.h.e.i.DefaultLoadEventListener Load request found matching entity in context, but the matched entity was of an inconsistent return type; returning null
据我所知,它不知道如何将
实体
从父类型升级到子类型,只是因为冲突而引发异常-具有相同
id的实体已经存在


这个问题有什么解决方案吗?

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

也就是说,您可能可以使用本机更新查询实现所需的行为。您需要更新鉴别器列(
DTYPE
)列,并在对应于子实体的表中插入新行(请注意,在
SINGLE_表
策略中,更新鉴别器列就足够了)


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

事实上,所有的事情都把我看作是一个解决办法,但我有同样的想法,谢谢。