当前位置: 首页 > 面试题库 >

Hibernate,更改标识符/主键

纪勇军
2023-03-14
问题内容

我收到的时候我想改变我的以下异常@ID中的@Entity

identifier of an instance of com.google.search.pagerank.ItemEntity was altered from 1 to 2.

我知道我要更改表中的主键。我正在使用JPA注释。

我通过使用以下单个HQL查询解决了此问题: update Table set name=:newName where name=:oldName

而不是使用更多的OO方法

beginTransaction();
T e = session.load(...);
e.setName(newName);
session.saveOrUdate(e);
commit();

知道差异是什么吗?


问题答案:

我无法想象你为什么要这么做。完全没有
您为什么要更改实体的身份?您还需要更新指向它的其他表中的所有外键。似乎很痛苦,没有收获。您最好将其设置为“业务密钥”(普通属性),并使用更永久的代理密钥。我有种感觉,那就是您要解决所有这些错误,但是如果您坚持要…

本质上,您正在做的是创建一个新的Customer并删除旧的Customer,这就是我在Hibernate中实现它的方式。

[伪代码]

Begin Transaction

// create new customer from old
newC = Session.Load<Customer>(42)
Session.Evict(newC)
newC.Id = 1492
Session.Save(newC)

// update other relationships to point to newC
// ....

// delete old customer
oldC = Session.Load<Customer>(42)
Session.Delete(oldC)

Commit Transaction

但是,最好只在一个简单的单个SQL事务中一次完成所有操作,并且在任何一种情况下,您都冒着并行进程已经具有“老”
Customer实例的风险,这可能会导致一些错误。



 类似资料:
  • 我尝试使用scp将文件复制到远程服务器。 当我执行时,我得到了错误: 所以我从~/中删除了known_hosts文件。ssh并再次尝试该命令。但还是有这样的信息。我需要在哪里修改我的文件,然后除了。ssh文件夹?

  • 我重新安装了服务器,收到以下消息: 我已经尝试了我在互联网上找到的各种解决方案。我的文件(通常在)在中。我试着编辑它,但它仍然保持一种状态。我已经安装了ipa-client和Fedora19。如何解决此警告? 只有在您没有安装Freeipa的情况下,到目前为止回答的所有答案才起作用。

  • 输入命令后 我收到一个错误

  • 问题内容: 对于使用不区分大小写的数据库模式的JPA实体模型,当我使用@IdClass批注时,始终会出现“实例标识符已更改”异常。对于具有“字符串”主键的对象,当数据库中存在一种情况的字符串并且使用相同的字符串(仅大小写不同)执行查询时,将发生错误。 我看过其他的SO答案,它们的形式是:a)不要修改主键(我不是),b)equals()/ hashCode()实现有缺陷。对于’b’,我尝试使用和,但

  • 如何更改身份栏? 例如,我有一张表: 我需要随着时间的推移而改变

  • 我试着用谷歌搜索如何做到这一点,但是我所有的谷歌搜索都得到了结果,人们想要更改标识列的内容,而不仅仅是更改标识种子号。有没有一个简单的查询我可以用来完成我想要做的事情?