1

从我之前的问题中复制并粘贴一些介绍性部分。

我在 EclipseLink 2.3.2 中使用 JPA 2.0,其中产品及其颜色之间存在多对多关系。一种产品可以有多种颜色,一种颜色可以与多种产品相关联。这种关系在数据库中由三个表表示。

  • 产品
  • prod_colour(连接表)
  • 颜色

prod_colour表有两个引用列prod_id,并分别colour_id来自其相关的父表productcolour

很明显,实体类Product有一组颜色——java.util.Set<Colour>命名为colourSet.

实体类Colour有一组产品 -java.util.Set<Product>名为productSet.


为了在表中添加和删除行prod_colour,我在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 回答