【问题标题】:JPA 2.0 / Hibernate and "orphanRemoval": Just replacing an entity does not remove the old oneJPA 2.0 / Hibernate 和“orphanRemoval”:仅替换实体不会删除旧实体
【发布时间】: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”)不起作用?

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

非常感谢!

【问题讨论】:

    标签: java hibernate jpa orphan


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      就@OneToMany 关系而言,这与Hibernate JIRA 票证HHH-6709 有关。请为这些投票,以便引起关注。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多