2013-01-25 161 views
1

我有下一個實體。 CarHuman有ManyToMany關係。我用的輔助類分配之間汽車用戶刪除具有關係的實體

@Entity 
public class Car implements Serializable 
{ 
    //... 

    @LazyCollection(LazyCollectionOption.TRUE) 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "car") 
    private Set<Assign> cars = new HashSet<Assign>(); 
    //... 
} 

@Entity 
class Assign implements Serializable 
{ 
    //... 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @ManyToOne 
    @JoinColumn(name = "HUMAN_CAR", nullable = false) 
    private Human human; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @ManyToOne 
    @JoinColumn(name = "CAR_HUMAN", nullable = false) 
    private Car car; 
    //.. 

} 

@Entity 
public class Human implements Serializable 
{ 
    //... 

    @LazyCollection(LazyCollectionOption.TRUE) 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "human") 
    private Set<Assign> cars = new HashSet<Assign>(); 
    // ... 
} 

現在我嘗試刪除裏面的容器管理事務

public void deleteCar(final long id) 
    {  
     final Car car = entityManager.find(roleId, Car.class); 
     entityManager.remove(car); 
    } 

車,但我得到

Caused by: javax.persistence.EntityNotFoundException: deleted entity passed to persist: [com.dto.Assign#<null>] 
+0

也許你必須刪除所有'Assign'-s,然後再移除'Car'。 – gaborsch

+0

@GaborSch但我有'CascadeType.ALL'。我認爲Hibernate應該刪除它們 – Ilya

+0

爲什麼你使用'Assign'實體?你可以使用'ManyToMany'關係。或者'Assign'實體中還有其他字段嗎? – home

回答

1

在刪除car之前,您需要先rem Ove carAssign

這裏還有另一個設計問題。您有CascadeType.ALLcarsCar實體,這意味着Car及其分配具有組成關係(而不僅僅是聚合/關聯關係)。另一方面,人與其指派之間也存在同樣的關係。明顯分配的cars可以在汽車和人類之間共享,但是組成關係遵循非共享語義。假設一個刪除一輛汽車並將其級聯刪除,那些共享在person一側的將成爲孤兒。

1

取出Assign -s您刪除Car

public void deleteCar(final long id) 
{  
    final Car car = entityManager.find(roleId, Car.class); 
    for(Assign assign : car.getAssigns()) { 
    entityManager.remove(assign); 
    } 
    entityManager.remove(car); 
} 

你吸氣劑可有不同的名稱之前,我看不到代碼。

相關問題