2012-01-10 120 views
0

我有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 
} 

之间的父子关系。在这种特殊情况下,也有父无子记录。当我更新父级时,即使父级不包含任何子级记录,但hibernate仍会引发以下异常,并且不会尝试更新/添加/删除任何子级记录。代码中完全不访问子集合。我正在使用所有JPA注释。 Hibernate版本是3.6.7.Final。任何指针表示赞赏。

org.hibernate.HibernateException:与级联集合=“全删除,孤儿”由所拥有的实体实例不再被引用: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);  
    } 
+0

我们可以看到更新的代码吗? – 2012-01-10 16:59:54

+0

感谢您的时间。我添加了更新的代码。 – user531248 2012-01-10 18:37:56

回答

0

我怀疑dozerMapper的确具有收藏的东西。尝试将字段从DTO复制到实体而不使用推土机。

此外,saveOrUpdate需要一个分离的实例,并将其附加到会话中。如果已分离实体的已连接版本已加载到会话中,则会引发异常。

传递给saveOrUpdate的父代已被附加,因此对saveOrUpdate的调用完全没有必要(并可能导致异常)。对连接实体所做的更改会自动由Hibernate持久保存。您无需致电saveOrUpdateupdatemerge

+0

嗨JB Nizet。感谢删除推土机映射的伎俩。 – user531248 2012-01-11 08:59:41