如何避免使用JPA注释循环引用?
我正在为一家商店注释域模型(使用JPA 2,使用Hibernate提供程序)。
在商店里,每件产品都可以有Category
。每个类别可以被分配到几个超类别和子类别中,这意味着类别"蜡烛"可以将"餐厅"和"装饰"作为父母,将"普通蜡烛"和"多芯蜡烛"作为孩子,等等。
现在我要避免循环引用,即类别"a"的父级为"b",而类别"a"的父级又为"a"。
有没有办法在JPA中检查带有约束的循环引用?或者我必须自己写一些检查,也许是用@PostPersist
注释的方法?
这是我的Category
类:
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToMany
private Set<Category> superCategories;
@ManyToMany(mappedBy="superCategories")
private Set<Category> subCategories;
public Category() {
}
// And so on ..
}
解决方案
我认为您必须通过代码中的业务规则进行检查。为什么不在一个单独的实体中分离这些ManyToMany映射呢?例如:
@Entity
@Table(name = "TB_PRODUCT_CATEGORY_ROLLUP")
public class ProductCategoryRollup {
private ProductCategory parent;
private ProductCategory child;
@Id
@GeneratedValue
public Integer getId() {
return super.getId();
}
@Override
public void setId(Integer id) {
super.setId(id);
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_PRODUCT_CATEGORY_PARENT", nullable=false)
public ProductCategory getParent() {
return parent;
}
public void setParent(ProductCategory parent) {
this.parent = parent;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_PRODUCT_CATEGORY_CHILD", nullable=false)
public ProductCategory getChild() {
return child;
}
public void setChild(ProductCategory child) {
this.child = child;
}
}
通过这种方式,您可以在保存新实体之前查询任何现有的父子组合。
相关文章