![]() |
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?或者不同的生成器策略类型之一,可能是为了避免合并生成新的序列值,但我怀疑这会有问题。 |
![]() |
Axel Kennedal · Redux持续立即崩溃 7 年前 |
![]() |
Rougher · Spark持久化函数在数据集重用中的应用 7 年前 |
![]() |
Araf · 当我尝试插入通知类型对象时,子实体也尝试插入 7 年前 |
![]() |
gschambial · 尝试级联持久子实体时出现持久异常 7 年前 |
![]() |
juliam · JSON在发布对象时递归调用该对象 7 年前 |
![]() |
Pj- · 搁置模块不适用于“with”语句 7 年前 |
![]() |
Dmitry Senkovich · JPA中的事务同步与事务关联 7 年前 |