处理由JPA关系引起的循环引用的策略?

时间:2012-12-08 17:01:35

标签: java jpa module packaging

我正在尝试通过打包到feature-a.jar,feature-b.jar等单独的jar中的功能将我的应用程序划分为模块。

feature-a.jar等个别功能包应该包含功能的所有代码,包括jpa实体,业务逻辑,rest apis,单元测试,集成测试......等等。

我遇到的问题是JPA实体之间的双向关系导致jar文件之间的循环引用。例如,客户实体应该在customer.jar中,订单应该在order.jar中,但客户引用订单和订单引用客户,这使得很难将它们拆分成单独的jar / eclipse项目。

我在处理JPA实体中的循环依赖关系时看到的选项:

  • 选项1:将所有实体放入一个jar /一个项目
  • 选项2:不映射某些双向关系以避免跨项目的循环依赖关系。

问题:

  • 您使用了哪些规则/原则来决定何时进行双向映射?
  • 您是否能够通过功能将jpa实体分解为自己的项目/ jar?如果是这样,您是如何避免循环依赖性问题的?

1 个答案:

答案 0 :(得分:2)

您在JPA中没有用于决定循环引用的规则。我也要测试它。

在我的示例中,有一个实体Category,其中OneToOneparentCategoryOneToManychildCategories为双向。

我认为,Circular Reference就像下面的数据结构一样。

CategoryID      Name    ParentID
001             AAA     002
002             BBB     003
003             CCC     004
004             DDD     001

我想建议哪些是有问题的。

示例:

public void addNewCategory(Category category) {
    checkCircularity(Category category, category.getParent());
}


public static void checkCircularity(Category child, Cagegory parent) throws CircularReferenceException {
    if (superior != null) {
        if (sub.isEqual(superior) || sub.isEqual(parent.getParent())) {
            throw new CircularReferenceException("Circularity Referencing.........");
        } else if (finder.getSuper(superior) != null) {
            checkCircularity(child, parent.getParent());
        }
    }
}

如果程序没有抛出CircularReferenceException,则该Category实例没有循环引用。