JPA Каскадная проблема «многие ко многим» - PullRequest
1 голос
/ 04 июня 2009

Если я создаю Заказчика и Контроллера, то связываю мой Контроллер с заказчиком, это хорошо экономит.

Если я затем удалю свой контроллер, это не удалит отношения между ними. Это вызывает исключение EntityNotFoundException при загрузке клиента.

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

Я хотел бы знать, как отобразить это так, чтобы при удалении контроллера также удалялась связь.

Таблицы базы данных

  • покупатель
  • Контроллер
  • customer_controllers - таблица сопоставления.

Идентификатор контроллера не удаляется из таблицы сопоставления 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 ]

3 голосов
/ 05 июня 2009

Если у вас есть ManyToMany, вы должны сопоставить контроллер с клиентом с

 @ManyToMany(mappedBy="controllers")

или наоборот, в зависимости от того, какая сторона является владельцем.

Как вы понимаете, отношение не полностью определено, и оно потерпит неудачу при таких событиях, как "Каскад".

1 голос
/ 05 июня 2009

Вы проверили Javadoc для @ ManyToMany ? Включает приведенные выше примеры отображений.

0 голосов
/ 05 июня 2009

вам нужно сделать отношение двунаправленным, чтобы объект контроллера знал о своих отношениях с клиентом. Это означает, что при удалении контроллера запись в таблице соединений также удаляется.

Это не точное отображение, но оно дает вам идею.

@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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...