JPA更新不适用于多对多关系

时间:2013-04-05 13:52:26

标签: jpa many-to-many updates

我有3张桌子:

  • customer(idCustomer,...)
  • is_managed(idCustomer,idPerson)
  • sales_person(idPerson,...)

@ManyToManycustomer之间存在sales_person关系。

当我执行删除时,它可以正常工作:customeris_managedsales_person被删除。

但是当我执行更新时,customeris_managed会更新,但sales_person不会更新。

例如,如果我通过删除customer更新sales_person,则会在is_managed表中删除,但不会在sales_person表中删除。

这是如何引起的?如何解决?

以下是相关代码:

// update customer
public String updateCustomer(Customer customer,ArrayList<Sales_person> sales_persons,ArrayList<Involved_group_relation> involved_groups, Macro_market macro_market)throws IOException {

   // insert the sales_person attached to the customer
   ArrayList<Sales_person> sales_personC = new ArrayList<Sales_person>();
   sales_personC.addAll(sales_persons);

    customer.setSalesPersons_BelongTo(sales_personC); // insert in customer the sales_persons

    em.merge(customer);
    return customer.getNameCustomer();
}

// entity customer
@Entity
@Table(name="customer")
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY)
    private Long idCustomer;

    private String titleTypeAccount;
    private String nameCustomer;

    /** RELATIONS **/
    // CUSTOMER - SALES_PERSON
    @ManyToMany(
            cascade={CascadeType.ALL}
    )
    @JoinTable(
        name="is_managed",
        joinColumns=@JoinColumn(name="idCustomer"),
        inverseJoinColumns=@JoinColumn(name="idPerson")
    )
    private Collection<Sales_person> salesPersons_BelongTo;
        ...
        ...

// entity sales_person
@Entity
@Table(name="sales_person")
public class Sales_person implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Long idPerson;

    private String nameSalesPerson;
    private String jobFunction;
    private String titleOrganization;

    @ManyToMany(
        mappedBy="salesPersons_BelongTo"
    )
    private Collection<Customer> customers;
    ...
    ...

1 个答案:

答案 0 :(得分:0)

如果要从数据库中删除SalesPerson,则必须在SalesPerson上调用em.remove()。调用merge()是不够的。

此外,如果您希望合并SalesPerson的更改,您还必须在SalesPerson上调用merge(),或者在salesPersons_BelongTo关系上设置级联合并。

同时确保你保持双向关系的两面,而不仅仅是一面。