1

私は3つのテーブルを持っています:

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

と の間には@ManyToMany関係がcustomerありsales_personます。

削除を実行すると、正常に機能します。 、customeris_managedおよびsales_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;
    ...
    ...
4

1 に答える 1

0

SalesPerson をデータベースから削除する場合は、SalesPerson で em.remove() を呼び出す必要があります。merge() を呼び出すだけでは不十分です。

また、SalesPerson の変更をマージしたい場合は、SalesPerson でも merge() を呼び出すか、salesPersons_BelongTo リレーションシップでカスケード マージを設定する必要があります。

また、一方だけではなく、双方向の関係の両側を維持していることも確認してください。

于 2013-04-08T14:02:56.220 に答える