2009-06-04 11 views
1

私は顧客とコントローラを作成して、それを保存した顧客に私のコントローラを関連付けます。JPA多対多カスケード問題

コントローラを削除しても、コントローラ間の関係は削除されません。 これにより、CustomerをロードするときにEntityNotFoundExceptionが発生します。

javax.persistence.EntityNotFoundException: Unable to find Controller with id 22 

これをマップする方法を知りたいので、コントローラを削除すると関係も削除されます。

データベーステーブル

  • 顧客
  • コントローラ
  • customer_controllers - マッピングテーブル。

コントローラのIDは、customer_controllersマッピングテーブルから削除されていません。

@Entity 
public class Customer implements Serializable{ 

    private Integer id; 
    private Set<Controller> controllers; 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 
    @ManyToMany(cascade={CascadeType.ALL}) 
    public Set<Controller> getControllers() 
    { 
      return controllers; 
    } 
    public void setControllers(Set<Controller> controllers) 
    { 
      this.controllers = controllers; 
    } 
} 

@Entity 
public class Controller implements Serializable{ 

    private Integer id; 
    private String name; 
    private String abbreviation; 

    @Id 
    @GeneratedValue 
    public Integer getId() 
    { 
      return id; 
    } 
    public void setId(Integer id) 
    { 
      this.id = id; 
    } 
    public String getName() 
    { 
      return name; 
    } 
    public void setName(String name) 
    { 
      this.name = name; 
    } 
    public String getAbbreviation() 
    { 
      return abbreviation; 
    } 
    public void setAbbreviation(String abbreviation) 
    { 
     this.abbreviation = abbreviation; 
    } 
} 

答えて

3

は、あなたが所有側でどちら側に応じて、

@ManyToMany(mappedBy="controllers") 

または他の方法で回避してお客様にコントローラーをマッピングする必要があります。

このように、関係は完全に定義されていないため、「カスケード」などのイベントでは失敗します。

+0

私はそれを両方向にマッピングする必要はないと思っていましたが、私が必要とする意味があります。ありがとう! – ScArcher2

0

コントローラオブジェクトが顧客との関係を認識するように、双方向の関係を作成する必要があります。つまり、コントローラが削除されると、結合テーブルのレコードも削除されます。

これは正確なマッピングではありませんが、それはあなたにアイデアを与えます。あなたは多対多を持っている場合は

@Entity 
public class Controller implements Serializable{ 

    private Integer id; 
    private String name; 
    private String abbreviation; 


    private Set<Customer> customers; 


    @Id 
    @GeneratedValue 
    public Integer getId() 
    { 
      return id; 
    } 
    public void setId(Integer id) 
    { 
      this.id = id; 
    } 
    public String getName() 
    { 
      return name; 
    } 
    public void setName(String name) 
    { 
      this.name = name; 
    } 
    public String getAbbreviation() 
    { 
      return abbreviation; 
    } 
    public void setAbbreviation(String abbreviation) 
    { 
     this.abbreviation = abbreviation; 
    } 
    @ManyToMany(cascade={CascadeType.ALL}) 
    public Set<Customer> getCustomers() 
    { 
     return customers; 
    } 
    public void setCustomers(Set<Customers> customers) 
    { 
     this.customers= customers; 
    } 

} 
1

@ManyToManyのjavadocを確認しましたか? 上記のマッピングの例が含まれています。