【发布时间】:2015-09-09 12:55:37
【问题描述】:
尝试更新“照片”时出现错误:
Photo photo = photoRepository.findById(id);
List<Photo> photos = user.getPhotos();
user.setPhotos(photos.add(photo));
userRepository.update(user);
显示跟随错误:
Different object with same identifier was already associated with the session
看起来,具有相同标识符的不同对象(第一个:第一行中的照片,第二个:user.getPhotos() 中的照片)。
所以,我无法更新我的用户。 如何避免此错误?
用户存储库:
tx = session.beginTransaction();
user = (User) session.get(User.class, id);
session.getTransaction().commit();
【问题讨论】:
-
您使用的是 Spring,为什么要手动管理事务?你永远不应该像那样获得一个集合并向它添加对象。您正在泄漏内部状态。您应该在您的
User上有一个addPhoto方法,该方法将Photo添加到集合中,并且假设它是双向关系,它也会执行Photo.setUser。 -
对不起,我改成 user.setPhotos(photos.add(photo));
-
我已经有了 photo.setUser()。你的意思是手动管理你的交易?你有其他方法吗?
-
更糟糕的是......您应该允许在外部设置内部集合,这对于托管集合尤其危险。
-
你应该阅读 cmets...