在 JPA 中更新实例的 ID
Updating the ID of an instance in JPA
我正在使用 JPA 注释(hibernate 实现),我想通过合并来更改实体的 ID it.There 是否有任何注释或解决方案可以避免复制然后删除实体?
使用 JPA 是不可能的,原因很充分:
- 您从持久性上下文中删除了一个实体并且您想要重新附加它,如果您删除建立连接的唯一方法,它怎么可能连接到修改它的原始行?好的,假设我们存储了原始 id 并尝试从那里开始,但是现在由于 id 是可修改的,所以 0 保证它在分离时也没有被其他进程更改,这使得我们存储的原始 id 无用并且造成彻底的混乱。
不过您可以采取变通办法:
- 使用本机查询修改行
- 不要将此列用作主键,而是使用生成的序列创建一个新的主键
- 复制然后删除您所说的实体也是完全有效和安全的,因为它在同一笔交易中
您可以使用 JPQL 在 jpa 中更改实体的 ID,如下例所示:
public void updateUsername(User userToUpdate,String newUserName) {
EntityManager manager=ConnectionDao.getConnecting();
User user=find(userToUpdate.getUsername());
manager.getTransaction().begin();
manager.createQuery("update User u set u.username=\'"+newUserName+"\'").executeUpdate();
manager.getTransaction().commit();
return;
}
我正在使用 JPA 注释(hibernate 实现),我想通过合并来更改实体的 ID it.There 是否有任何注释或解决方案可以避免复制然后删除实体?
使用 JPA 是不可能的,原因很充分:
- 您从持久性上下文中删除了一个实体并且您想要重新附加它,如果您删除建立连接的唯一方法,它怎么可能连接到修改它的原始行?好的,假设我们存储了原始 id 并尝试从那里开始,但是现在由于 id 是可修改的,所以 0 保证它在分离时也没有被其他进程更改,这使得我们存储的原始 id 无用并且造成彻底的混乱。
不过您可以采取变通办法:
- 使用本机查询修改行
- 不要将此列用作主键,而是使用生成的序列创建一个新的主键
- 复制然后删除您所说的实体也是完全有效和安全的,因为它在同一笔交易中
您可以使用 JPQL 在 jpa 中更改实体的 ID,如下例所示:
public void updateUsername(User userToUpdate,String newUserName) {
EntityManager manager=ConnectionDao.getConnecting();
User user=find(userToUpdate.getUsername());
manager.getTransaction().begin();
manager.createQuery("update User u set u.username=\'"+newUserName+"\'").executeUpdate();
manager.getTransaction().commit();
return;
}