从我之前的问题中复制并粘贴一些介绍性部分。
我在 EclipseLink 2.3.2 中使用 JPA 2.0,其中产品及其颜色之间存在多对多关系。一种产品可以有多种颜色,一种颜色可以与多种产品相关联。这种关系在数据库中由三个表表示。
- 产品
- prod_colour(连接表)
- 颜色
该prod_colour
表有两个引用列prod_id
,并分别colour_id
来自其相关的父表product
和colour
。
很明显,实体类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.
}