DDD - 存储库和多对多关系

时间:2011-08-10 16:20:31

标签: java domain-driven-design ddd-repositories

我是DDD的新手,我被困在这里: 我在两个实体之间存在多对多关系:用户和组。该关系不是聚合,因为用户可以在没有组的情况下存在,并且没有用户就可以存在组。

这是我的用户类代码:

public class User {

    private List<Group> groups = new ArrayList<Group>();

    private UserRepository userRepository;

    public void create() throws Exception{
        userRepository.create(this);        

        // I have to update the groups with the user.
        for (Group group : groups) {
            group.update();
        }
    }

     public void addGroup(Group group){
        if (!groups.contains(group)) {
            groups.add(group);
            group.addUser(this);
         }
    }
}

问题是,当我创建一个具有组的用户(我不能使用ORM)时,我不知道将这些类关联到何处。我在User的create方法中创建它,并通过Spring管理那里的事务。它是否正确?或者我应该将该代码放在userRepository或服务中吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

卢卡斯,我会:

1)创建一个用户工厂,该工厂可以接收应与新用户关联的组。工厂可以使用addGroup方法进行关联。

2)从User类中删除对UserRepository的引用。

答案 1 :(得分:0)

  

我在User的create方法中创建了它,并通过Spring管理那里的事务。它是否正确?

这种逻辑的正确性取决于存储库的编写方式和合同。如果存储库不会保留任何关系,那么它可能是设计不良的存储库的标志。我希望存储库能够实现存储实体关联的必要逻辑,而不仅仅是实体的简单属性。

基于ORM解决方案的存储库可以通过级联持久性事件使这更容易,但在您的情况下,它可能会导致两个存储库中的代码重复(我假设您有{{1同样)。如果您决定哪个实体拥有该关系,然后通过相应的存储库保持关联,则可能会更好。因此,关联中的任何更改都应仅由拥有关联的实体(在您的案例中看起来为GroupRepository)进行,并且通过推断,User应该管理关联。

答案 2 :(得分:0)

根据Eric Evans的书,很多很多协会都会让你的模型过于复杂。尝试用它们替换它们 2个多对一的关联。多对多关联的一部分总是有更多 商业价值高于其他。

在您的情况下,我会留下2个聚合 - UserGroup,其中User聚合负责持有GroupReferences一堆。

相关问题