2011-08-12 28 views
2

を削除し、私は2 entites持っている:製品は、複数のアップグレードのセットが含まれるように休止状態 - リンクエンティティ

@Entity 
@Table(name="product") 
public class Product { 
    private Long id; 
    private Set<Upgrade> upgrade; 

    @Id 
    @Column(name="id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @ManyToMany(mappedBy = "products", 
       targetEntity = Upgrade.class, 
       cascade = CascadeType.REFRESH, 
       fetch = FetchType.EAGER) 
    public Set<Upgrade> getUpgrade() { 
     return upgrade; 
    } 

    public void setUpgrade(Set<Upgrade> upgrade) { 
     this.upgrade = upgrade; 
    } 
} 

@Entity 
@Table(name="upgrade") 
public class Upgrade { 
    private Long id; 
    private Set<Product> products; 

    @Id 
    @Column(name="id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @ManyToMany(targetEntity = Product.class, cascade = CascadeType.REFRESH, fetch = FetchType.EAGER) 
    @JoinTable(name = "upgrade_product", 
       joinColumns = @JoinColumn(name = "upgrade_id"), 
       inverseJoinColumns = @JoinColumn(name="product_id")) 
    public Set<Product> getProducts() { 
     return products; 
    } 

    public void setProducts(Set<Product> products) { 
     this.products = products; 
    } 
} 

私のデータは、これらを作成します。

すなわちP1 {U1、U2、U3、U4} P2 {U1、U3、U5、U7}

Iアップグレードを削除する場合、すべてが正常です。これは製品から取り除かれたばかりです。 ただし、製品を削除すると、リンクされたすべてのアップグレードを削除しようとします。

どのようにして製品を削除し、アップグレードをそのままにすることができますか。

答えて

3

Productを削除する前に、そのSet<Upgrade>を消去してProductを保存してください。次のようなものがあります。

public void delete(Product p) 
{ 
    p.setUpgrade(Collections.emptySet()); 
    entityManager.remove(entityManager.merge(p)); 
} 
+5

マージは、製品がまだ永続コンテキストにない場合にのみ必要です。 – rit

+0

そこに不一致はありません。 –

+0

これは、なぜそれが必要なのか、そしてアップグレードを削除するのはなぜではないのかを説明していません。 –