我正在使用具有JPA 2.1的EclipseLink 2.5.1(和Hibernate 4.3.5 final)。给出MySQL中的以下表格。
产品与颜色之间存在多对多的关系。
产品可以有许多颜色,颜色可以与许多产品相关联。这种关系在数据库中由这些表表示。
prod_colour
表分别来自其相关父表prod_id
和colour_id
的两个参考列product
和colour
。
很明显,实体类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是否允许类似的东西来构建这种查询?