【问题标题】:Hibernate delete orphan休眠删除孤儿
【发布时间】:2012-02-07 02:04:21
【问题描述】:

我有 2 个班级之间的父子关系

父母

@Entity
@Table(name = "PARENT")
public class Parent {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private Long id;


    @Column(name = "NAME")
    private String name;

    @Column(name = "WAGES")
    private BigDecimal wages;


    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    private List<Child> children;   

    // getters and setters

    }

孩子

@Entity
@Table(name = "CHILD")
public class Child{

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    @Column(name = "PARENT_ID", nullable = false, insertable = false, updatable = false)
    private Long parentId;

    // getters and setters
}

在这种特殊情况下,父项没有子记录。当我更新父项时,即使父项不包含任何子记录并且我没有尝试更新/添加/删除任何子记录,休眠也会引发以下异常。子集合在代码中根本没有访问权限。我正在使用所有 JPA 注释。 Hibernate 版本是 3.6.7.Final。任何指针表示赞赏。

org.hibernate.HibernateException:拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合:com.mycode.Child

//服务代码

public Parent update(ParentDto dto) {
        Parent parent = parentDao.findById(dto.getId());    
        // Using Dozer to map dto object to entity object
        // http://dozer.sourceforge.net/
        dozerMapper.map(dto, parent);       
        taxFormW2Dao.saveOrUpdate(parent);
        return Parent;
    }

//道码

public void saveOrUpdate(Parent parent){
        // HibernateTempplate is injected through Spring
        HibernateTemplate template = getHibernateTemplate();
        getHibernateTemplate().saveOrUpdate(parent);    
    }

【问题讨论】:

  • 我们能看到更新的代码吗?
  • 感谢您的宝贵时间。我添加了执行更新的代码。

标签: hibernate jpa


【解决方案1】:

我怀疑 dozerMapper 对集合做了一些事情。尝试在不使用推土机的情况下将字段从 DTO 复制到实体。

此外,saveOrUpdate 采用分离的实例,并将其附加到会话。如果已在会话中加载了已分离实体的附加版本,则会引发异常。

传递给saveOrUpdate 的父级已经附加,因此对saveOrUpdate 的调用完全没有必要(并且可能导致异常)。对附加实体所做的更改由 Hibernate 自动保存。您无需致电saveOrUpdate、update 或merge。

【讨论】:

  • 嗨,JB 尼泽特。感谢删除推土机映射成功了。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 2018-02-23
  • 2011-01-02
  • 2012-10-22
  • 1970-01-01
  • 2011-03-17
  • 2010-09-23
  • 2014-10-07
相关资源
最近更新 更多