【发布时间】:2011-09-22 06:20:25
【问题描述】:
我对 JPA 2.0、Hibernate 和“orphanRemoval”有疑问。
首先我的设置:
- Spring 3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- 休眠 3.5.2-Final
- 数据库管理系统:PostgreSQL 9.0
我有两个比较简单的实体类,“User”和“AvatarImage”,一个“User”有一个“AvatarImage”,所以“User”和“AvatarImage”之间是有关系的。
在“用户”类中,属性如下所示:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
也就是说,如果“avatarImage”属性设置为空,“User”和“AvatarImage”之间的引用将被删除,“orphanRemoval”机制将从数据库中删除“avatarImage”(如果我'我错了)。
所以当我为某个用户更新“avatarImage”时,我目前必须这样写:
user.setAvatarImage( null ); // First set it to null
userRepository.save( user ); // Now "orphanRemoval" will delete the old one
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
所以先设置“avatarImage”属性为null,保存“用户”,然后设置新的AvatarImage“theNewAvatarImage”,再次保存用户。
这是目前对我有用的唯一方法 - “orphanRemoval”将删除旧的“avatarImage”,将其设置为“null”,然后保存用户。
但是,我原以为这段代码也应该可以工作:
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
所以我省略了将“avatarImage”设置为“null”,而只是设置了“theNewAvatarImage”,替换了旧的“avatarImage”。但这不起作用,旧的 AvatarImage 在事务提交时不会从数据库中删除。
有谁知道,为什么第二个代码(只是替换 AvatarImage 之前没有将其设置为“null”)不起作用?
非常感谢您提供的任何帮助
非常感谢!
【问题讨论】: