1

以前の質問から導入部分をコピーして貼り付けます。

製品とその色の間に多対多の関係がある EclipseLink 2.3.2 で JPA 2.0 を使用しています。製品には多くの色があり、色は多くの製品に関連付けることができます。この関係は、データベースでは 3 つのテーブルで表されます。

  • 製品
  • prod_colour (結合テーブル)

このテーブルには、関連する親テーブルとそれぞれからのprod_colour2 つの参照列がprod_idあります。colour_idproductcolour

明らかなように、エンティティ クラスには という名前Productの一連の色があります。java.util.Set<Colour>colourSet

エンティティ クラスには、という名前Colourの一連の製品があります。java.util.Set<Product>productSet


テーブルに行を追加したり、テーブルから行を削除したりするために、次のようにエンティティ クラス自体prod_colourに 2 つのメソッドを定義しました。Colour

public void addToProduct(Product product) {
    this.getProductSet().add(product);
    product.getColourSet().add(this);
}

public void removeFromProduct(Product product) {
    this.getProductSet().remove(product);
    product.getColourSet().remove(this);
}

これらのメソッドは、次のように EJB から呼び出されます。

@Override
@SuppressWarnings("unchecked")
public void insert(List<Colour> colours, Product product) {
    for (Colour colour : colours) {
        colour.addToProduct(product);
    }
}

@Override
@SuppressWarnings("unchecked")
public void delete(Colour colour, Product product) {
    colour.removeFromProduct(product);
}

テーブルに行を追加したり、テーブルから行を削除したりすることを期待していprod_colourますが、何も起こりません (エラーも例外も発生しません)。同じことがHibernateでも機能します。それで、ここで他に何が欠けていますか?


編集:

Productエンティティ クラス:

public class Product implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "prod_id")
    private Long prodId;

    private static final long serialVersionUID = 1L;

    @JoinTable(name = "prod_colour", joinColumns = {
        @JoinColumn(name = "prod_id",
                    referencedColumnName = "prod_id")},
                    inverseJoinColumns = {
                        @JoinColumn(name = "colour_id", referencedColumnName = "colour_id")})
    @ManyToMany(fetch = FetchType.LAZY)
    private Set<Colour> colourSet;

    //Getters and Setters.
}

Colourエンティティ クラス。

public class Colour implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "colour_id")
    private Long colourId;

    private static final long serialVersionUID = 1L;

    @ManyToMany(mappedBy = "colourSet", fetch = FetchType.LAZY)

    private Set<Product> productSet;

    //Setters and getters.
}
4

1 に答える 1

1

その結合テーブルを更新するには、たとえば完全に/熱心に読み込まれたエンティティが必要であり、コードを記述した後、次を呼び出すことを忘れないでください。

entityManager.merge(colour);
entityManager.merge(product);
于 2013-11-08T23:59:14.993 に答える