![]() |
1
11
Hibernate试图使持久性尽可能透明,这意味着它试图遵循与普通Java对象相同的原则。现在,用Java重述你的问题,你会得到:
你知道答案-你不能。你可以创建一个 新的 C的实例并复制必要的属性,但B将 总是 是B,而不是C。因此,您最初的问题的答案是-它不能通过JPA或HibernateAPI完成。
但是,与普通Java不同,用Hibernate可以欺骗:
因此,算法是:
|
![]() |
2
2
在这种情况下,“c”是一个Hibernate会话不知道的对象,但它有一个ID,因此它假定该对象已经被持久化。在该上下文中,persist()没有任何意义,因此失败了。 javadoc for hibernate session.persiste()(我知道您没有使用hibernate API,但是语义相同,hibernate文档更好)说“使临时实例持久化”。如果您的对象已经有了一个ID,那么它不是暂时的。相反,它认为它是一个分离的实例(即已被持久化,但与当前会话没有关联的实例)。 我建议您尝试merge()而不是persist()。 |
![]() |
3
0
您可以使用自己的ID(未生成)并执行以下操作:
这样,在以C的形式重新插入之前,您将从表中清除ID。 |
![]() |
4
0
如何区分表中的两个实体?我假设有一些字段值(或值)可以改变,使B变成C? 您可以使用一个方法来加载超级类A,更改区分值并保存。然后在下一个休眠会话中,您的b将是c。 |
![]() |
5
0
我认为斯卡夫曼就在这里,一旦设置了ID,它就不会持久,而且由于生成了ID,它期望序列负责分配ID号。 您可能无法将ID设置为@generatedvalue?或者不同的生成器策略类型之一,可能是为了避免合并生成新的序列值,但我怀疑这会有问题。 |
![]() |
Gero Mendy · 如何为一个类分配兵变的结果。查询 1 年前 |
![]() |
Hamvy B · 替换不推荐的hibernate方法 1 年前 |
![]() |
Martin Pfeffer · Spring Boot JPA 1 年前 |
|
denstran · 休眠未生成正确的id 1 年前 |
![]() |
Frank · 忽略/跳过Hibernate架构验证中的特定字段 1 年前 |