5

我正在使用具有 JPA 2.1 的 EclipseLink 2.5.1(和 Hibernate 4.3.5 final)。给定 MySQL 中的下表。

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

产品与其颜色之间存在多对多的关系。

一种产品可以有多种颜色,而一种颜色又可以与多种产品相关联。这种关系在数据库中由这些表表示。

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

很明显,实体类Product有一个颜色列表——java.util.List<Colour>命名为colourList.

实体类Colour有一个产品列表 -java.util.List<Product>名为productList.


Colour实体中的关系:

public class Colour implements Serializable {

    @JoinTable(name = "prod_colour", joinColumns = {
        @JoinColumn(name = "colour_id", referencedColumnName = "prod_id")}, inverseJoinColumns = {
        @JoinColumn(name = "prod_id", referencedColumnName = "colour_id")})
    @ManyToMany(mappedBy = "colourList", fetch = FetchType.LAZY)
    private List<Product> productList; //Getter and setter.

    //---Utility/helper methods---

    //Add rows to the prod_colour table.
    public void addToProduct(Product product) {
        this.getProductList().add(product);
        product.getColourList().add(this);
    }

    //Delete rows from the prod_colour table.
    public void removeFromProduct(Product product) {
        this.getProductList().remove(product);
        product.getColourList().remove(this);
    }
}

Product实体中的关系:

public class Product implements Serializable {

    @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 List<Colour> colourList; //Getter and setter.
}

连接表中的一行prod_colour可以按照以下方式删除:

public boolean delete(Colour colour, Product product)
{
    Colour c=entityManager.find(Colour.class, colour.getColourId());
    Product p=entityManager.find(Product.class, product.getProdId());
    c.removeFromProduct(p);
    return true;
}

我们可以有一个等效的CriteriaDelete查询来执行相同的操作吗?

如下查询

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaDelete<Entity> criteriaDelete = criteriaBuilder.createCriteriaDelete(Entity.class);
Root<Entity> root = criteriaDelete.from(entityManager.getMetamodel().entity(Entity.class));
criteriaDelete.where(criteriaBuilder.equal(root, entity));
entityManager.createQuery(criteriaDelete).executeUpdate();

不能直观地编写,因为没有要在prod_colour其上执行此查询的连接表的实体类。

JPA 2.1 是否允许类似的东西来构造这种查询?

4

0 回答 0