It'*_*eto 15 java hibernate jpa orphan
我对JPA 2.0,Hibernate和"orphanRemoval"有疑问.
首先我的设置:
我有两个相当简单的实体类,"User"和"AvatarImage","User"有一个"AvatarImage",所以在"User"和"AvatarImage"之间有关系.
在"用户"类中,属性如下所示:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
Run Code Online (Sandbox Code Playgroud)
这意味着,如果"avatarImage"属性设置为null,则"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 );
Run Code Online (Sandbox Code Playgroud)
因此,首先将"avatarImage"属性设置为null,保存"user",然后设置新的AvatarImage"theNewAvatarImage",再次保存用户.
这是它目前适用于我的唯一方式 - "orphanRemoval"将删除旧的"avatarImage",将其设置为"null",然后保存用户.
但是,我会认为这段代码也应该有效:
user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );
Run Code Online (Sandbox Code Playgroud)
所以我省略将"avatarImage"设置为"null",只是设置"theNewAvatarImage",替换旧的"avatarImage".但这不起作用,旧的AvatarImage在事务提交时不会从数据库中删除.
有谁知道,为什么第二个代码(只是替换AvatarImage而不将其设置为"null"之前)不起作用?
我非常感谢您提供的任何帮助
非常感谢!
Vin*_*lds 12
这与Hibernate JIRA门票HHH-5559和HHH-6484有关.总的来说,截至今天,Hibernate要求您在为关系提供新值之前将引用设置为null并刷新持久性上下文(请参阅HHH-6484中的测试用例); 只有在这种情况下,Hibernate才会发出一个SQL DELETE
语句,为其提供一个破坏的实现(恕我直言)orphanRemoval
.
简而言之,您需要等待修复错误,或编写代码以使引用无效并刷新持久性上下文,或者使用orphanRemoval
以这种方式支持的JPA提供程序(EclipseLink 2.3.0).
归档时间: |
|
查看次数: |
6567 次 |
最近记录: |