gpt4 book ai didi

java - JPA 2.0/Hibernate 和 "orphanRemoval": Just replacing an entity does not remove the old one

转载 作者:太空狗 更新时间:2023-10-29 22:56:25 25 4
gpt4 key购买 nike

我对 JPA 2.0、Hibernate 和“orphanRemoval”有疑问。

首先我的设置:

  • Spring 3.0.5.RELEASE
  • SprnigData JPA 1.0.1.RELEASE
  • hibernate 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”属性设置为 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 );

所以首先将“avatarImage”属性设置为空,保存“用户”,然后设置新的头像“theNewAvatarImage”,再次保存用户。

这是它目前对我有用的唯一方法——“orphanRemoval”将删除旧的“avatarImage”,将其设置为“null”,然后保存用户。

但是,我认为这段代码也应该有效:

user.setAvatarImage( theNewAvatarImage );
userRepository.save( user );

所以我省略了将“avatarImage”设置为“null”,只是设置了“theNewAvatarImage”,替换了旧的“avatarImage”。但这不起作用,旧的 AvatarImage 不会在事务提交时从数据库中删除。

有谁知道,为什么第二个代码(只是替换 AvatarImage 之前没有将其设置为“null”)不起作用?

非常感谢您提供的任何帮助

非常感谢!

最佳答案

这与 Hibernate JIRA 门票有关 HHH-5559HHH-6484 .总的来说,从今天开始,Hibernate 要求您将引用设置为 null 并刷新持久性上下文,然后再为关系提供新值(请参阅 HHH-6484 中的测试用例);只有在这种情况下,Hibernate 才会发出 SQL DELETE 语句,为 orphanRemoval 提供损坏的实现(恕我直言)。

简而言之,您需要等待错误被修复,或者编写代码使引用无效并刷新持久性上下文,或者以这种方式使用支持 orphanRemoval 的 JPA 提供程序 ( EclipseLink 2.3.0 可以)。

关于java - JPA 2.0/Hibernate 和 "orphanRemoval": Just replacing an entity does not remove the old one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com