Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理JPA关系引起的循环引用的策略?_Java_Jpa_Module_Packaging - Fatal编程技术网

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

Java 处理JPA关系引起的循环引用的策略?,java,jpa,module,packaging,Java,Jpa,Module,Packaging,我试图通过打包到单独jar中的特性将我的应用程序划分为模块,如feature-a.jar、feature-b.jar等等。。。等等 诸如feature-a.jar之类的单个特性jar应该包含特性a的所有代码,包括jpa实体、业务逻辑、RESTAPI、单元测试、集成测试。。。等等 我遇到的问题是JPA实体之间的双向关系导致jar文件之间的循环引用。例如,客户实体应该在Customer.jar中,订单应该在Order.jar中,但是客户引用了Order,订单引用了Customer,这使得很难将它们拆

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

诸如feature-a.jar之类的单个特性jar应该包含特性a的所有代码,包括jpa实体、业务逻辑、RESTAPI、单元测试、集成测试。。。等等

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

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

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

  • 您使用了哪些规则/原则来决定何时进行双向映射
  • 您是否能够通过特性将jpa实体分解为它们自己的项目/jar?如果是这样,您如何避免循环依赖性问题
您在
JPA
中没有用于决定循环引用的规则。我还得测试一下

在我的示例中,有一个实体
Category
,它将
OneToOne
parentCategory
OneToMany
childCategories
作为双向对象

我认为,
循环引用
类似于下面的数据结构

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());
        }
    }
}

如果程序没有抛出
循环引用异常
,则该
类别
实例没有循环引用。

Franky,如果实体都是同一应用程序的一部分,我看不出将实体拆分成几个JAR会带来什么,除了额外的复杂性。这不是我所要寻找的,我关心的是java类之间的循环,而不是数据库中的数据。我仍然觉得您的解决方案很有用,所以我对它投了赞成票。@ams数据库的每个数据都代表每个java实例