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

ams*_*ams 5 java packaging jpa module

我试图通过打包到单独的 jar 中的功能将我的应用程序分区为模块,例如 feature-a.jar、feature-b.jar 等。

单个功能 jar(例如 feature-a.jar)应包含功能 a 的所有代码,包括 jpa 实体、业务逻辑、rest api、单元测试、集成测试...等。

我遇到的问题是 JPA 实体之间的双向关系导致 jar 文件之间的循环引用。例如,客户实体应位于 customer.jar 中,订单应位于 order.jar 中,但客户引用订单,订单引用客户,因此很难将它们拆分为单独的 jars/eclipse 项目。

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

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

问题:

  • 您使用什么规则/原则来决定何时进行双向映射或不进行双向映射?
  • 您是否能够按功能将 jpa 实体分解为自己的项目/jar 如果可以的话,您如何避免循环依赖问题?

Zaw*_* oo 2

您没有使用任何规则来决定 中的循环引用JPA。我也得测试一下。

在我的示例中,有一个实体Category必须OneToOneparentCategory双向OneToManychildCategories

我想,Circular Reference 就像下面的数据结构。

CategoryID      Name    ParentID
001             AAA     002
002             BBB     003
003             CCC     004
004             DDD     001
Run Code Online (Sandbox Code Playgroud)

我想建议哪些是应该避免的问题。

例子 :

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果程序不抛出异常CircularReferenceException,则该Category实例不存在循环引用。