2009-06-04 154 views
1

如果我創建一個客戶和控制器,然後將我的控制器與客戶相關聯,它可以很好地保存。JPA多對多級聯問題

如果我然後刪除我的控制器它不會刪除它們之間的關係。 當我加載客戶時,這會導致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") 

或其他方式映射到客戶,這取決於哪一方擁有方。

就像你現在這個關係沒有完全定義一樣,它會在諸如「Cascade」之類的事件上失敗。

+0

我希望自己不必映射它兩種方式,但它是有道理的,我需要。謝謝! – ScArcher2 2009-06-05 15:30:24

0

您需要使雙向關係成爲可能,以便控制器對象知道它與客戶的關係。 Yhis表示當控制器被刪除時,連接表中的記錄也被刪除。

這不是確切的映射,但它給你的想法。

@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?它包含上面的示例映射。