Java 创建具有循环依赖关系的实体映射器

Java 创建具有循环依赖关系的实体映射器,java,dependencies,cycle,Java,Dependencies,Cycle,我正在做的一个项目有问题。我需要创建一个映射器,将实体对象转换为它的VO(值对象)形式,我需要这样做来限制我的持久性层和业务层之间的依赖关系,但我有一些无法解析的循环依赖关系,请看这个示例: 我想在我的业务层中使用一个能力对象,因此我使用映射器将实体转换为我的层可以使用的VO class Competence { private Domain dom; } class Domain { private List<Competence> lComp; } 班级能力{

我正在做的一个项目有问题。我需要创建一个映射器,将实体对象转换为它的VO(值对象)形式,我需要这样做来限制我的持久性层和业务层之间的依赖关系,但我有一些无法解析的循环依赖关系,请看这个示例:

我想在我的业务层中使用一个能力对象,因此我使用映射器将实体转换为我的层可以使用的VO

class Competence {
    private Domain dom;
}

class Domain {
    private List<Competence> lComp;
}
班级能力{
私有域dom;
}
类域{
私人名单lComp;
}
但是当我转换一个能力对象时,我也需要转换一个域,当我转换一个域时,我需要转换能力列表等等。。。我真的不想转换我数据库的一半:/

我一直在考虑转换对象的一半或避免某些对象来停止循环,但这很危险,这并不是解决我问题的真正方法:/

你有解决这个问题的办法吗


提前感谢!:)

有几种方法可以解决这个问题。首先,你必须决定要转换哪一方。假设您想要转换
能力
s,而不是转换
s

  • 使用ID引用
    能力
    中的
  • 使用存根
    对象,该对象仅包含所需的ID和一组最小字段(不包括
    能力
    s)

  • 希望我正确地理解了您的问题。

    处理此类问题的一个标准机制是重新编码如下:

    class Competence {
    }
    
    class Domain {
    }
    
    class CompetenceDomain {
      Competence competence;
      Domain domain;
    }
    
    Map<Domain,List<Competence>> domainsWithCompetence = ...;
    Map<Competence,Domain> competencesInDomain = ...;
    
    班级能力{
    }
    类域{
    }
    类能力域{
    能力;
    域域;
    }
    映射域权限=。。。;
    映射能力域=。。。;
    

    这将对象的关系从对象本身分离到一个单独的机制中。

    是否使用现有的持久层实现(例如Hibernate)还是您自己管理持久性?我使用EclipseLink来管理持久性层您是否因为尝试将ValueObject转换为XML(例如,从web服务返回对象时自动发生)而遇到此问题?否,我需要最小化持久性层和业务层之间的依赖关系,为此,我创建了一些与持久层使用的实体类相对应的VO,我创建了一个带有静态方法的简单映射器类,在其中我传递实体或VO对象以转换为其他类型,我不知道我是否清楚?除息的