JPA多对多级联问题

时间:2009-06-04 16:24:01

标签: java hibernate jpa

如果我创建了一个客户和控制器,那么将我的控制器与客户关联就可以保存。

如果我然后删除我的控制器,它不会删除它们之间的关系。 当我加载Customer时,这会导致EntityNotFoundException。

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

我想知道如何映射这个,这样当删除Controller时,关系也会被删除。

数据库表

  • 客户
  • 控制器
  • customer_controllers - 映射表。

Controller的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 个答案:

答案 0 :(得分:3)

如果您有ManyToMany,那么您应该使用

将Controller映射到Customer
 @ManyToMany(mappedBy="controllers")

或者相反,取决于哪一方是拥有方。

正如你现在所知,关系没有完全定义,它会在像“Cascade”这样的事件上失败。

答案 1 :(得分:1)

你检查了@ManyToMany的javadoc吗? 它包括上面的示例映射。

答案 2 :(得分: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;
    }

}