2012-01-10 121 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