Hibernate升级对象从父类到JOINED继承中的子类

时间:2017-09-20 14:58:16

标签: 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 {
   ...
}

在我的逻辑的第一步,我应该保存Parent object没有子类型。 在第二步,我知道它应该属于哪个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的实体已经存在。

这个问题有解决方法吗?

1 个答案:

答案 0 :(得分:1)

JPA是一种将Java域模型映射到关系数据库模式的方法。由于没有将父母班级推广到儿童班级的事情。在Java中,JPA不支持这种操作。

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

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