【发布时间】:2013-11-21 02:43:15
【问题描述】:
从我的previous question 复制并粘贴一些介绍性部分。
我在 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.
}
【问题讨论】:
-
是的,它们都不起作用(没有错误,没有异常)。
-
您确定,您检查了正确的表格吗?你检查过数据库查询日志吗?您是否还与
entityManager.merge(colour)最终也与产品合并? -
是的,这不会生成任何
DELETE或INSERT语句(我已在presistence.xml文件中启用调试)。 -
用
entityManager.merge(colour)合并/保存数据库中的实体怎么样? -
使用
entityManager.merge(colour),更改将保存到colour表本身,应该对prod_colour表进行更改 - 连接表。
标签: jpa many-to-many jpa-2.0 eclipselink