【问题标题】:Add/delete rows to and from a many-to-many relationship in JPA provided by EclipseLink在 EclipseLink 提供的 JPA 中向多对多关系添加/删除行
【发布时间】:2013-11-21 02:43:15
【问题描述】:

从我的previous question 复制并粘贴一些介绍性部分。

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

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

prod_colour 表有两个引用列 prod_idcolour_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.
}

【问题讨论】:

  • 是的,它们都不起作用(没有错误,没有异常)。
  • 您确定,您检查了正确的表格吗?你检查过数据库查询日志吗?您是否还与entityManager.merge(colour) 最终也与产品合并?
  • 是的,这不会生成任何DELETEINSERT 语句(我已在presistence.xml 文件中启用调试)。
  • entityManager.merge(colour)合并/保存数据库中的实体怎么样?
  • 使用entityManager.merge(colour),更改将保存到colour 表本身,应该对prod_colour 表进行更改 - 连接表。

标签: jpa many-to-many jpa-2.0 eclipselink


【解决方案1】:

为了更新该连接表,您需要例如完全/急切加载的实体,并且在您编码之后,不要忘记调用:

entityManager.merge(colour);
entityManager.merge(product);

【讨论】:

  • 与 Hibernate 一样,多对多关系中的惰性获取也适用于 EclipseLink 2.5.1 中的更新(和所有其他)操作。对版本不太确定,除了更新 EclipseLink 之外,我还在应用程序的各处将java.util.Set 更改为java.util.List 并进行了一些其他更改。这些变化可能存在差异。这几乎都是偶然发生的,我找不到延迟提取如何以及何时开始工作的确切原因。
猜你喜欢
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2020-09-12
  • 2015-07-10
  • 2021-08-08
相关资源
最近更新 更多