2017-09-24 1 views
2

두 모델 : UserRoom 있습니다. 사용자는 많은 방에 속하며 방에는 많은 사용자가 있습니다.
현재 내가 찾거나 그를 생성하거나,ddd에 많은 관계 많은 모델

public class User extends BasePersistable { 

    private static final long serialVersionUID = 1492535311821424305L; 

    @Column(nullable = false, unique = true) 
    private String login; 

    @Column(nullable = false) 
    private Integer uid; 

    @ManyToMany(targetEntity = Room.class) 
    @JoinTable(name = "room_users", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "room_id")}) 
    private Set<Room> rooms = new HashSet<>(); 

public class Room extends AbstractAggregateRoot implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @JsonIgnore 
    private Long id; 

    @ManyToMany(mappedBy = "rooms", targetEntity = User.class, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}) 
    @JsonIgnore 
    private Set<User> users = new HashSet<>(); 

사용자가 로그인

이 있고, 나는 몇 가지 규칙에 따라 그를 위해 방을 찾거나 만들 수 있습니다.
나에게는 두 가지 사항이 매우 명확합니다.
1) 방이 많은 메시지가 있고 메시지가 방이 없으면 존재하지 않으므로 방은 집계입니다.
2) 사용자는 회의실 범위 밖에서 조작해야하므로 사용자도 전체 루트 여야합니다.

그래서 여기에 문제가 있습니다. 나는 합계 루트가 (값 개체를 통해서만) 다른 집계 루트를 참조하지 않는다는 것을 배웠습니다. 집계 루트는 외부 소스 (이 경우 사용자 집계 루트)에 의존하지 않고 존재해야하는 모든 것을 포함해야합니다.

어떻게 이러한 관계를 만들 수 있습니까? 사용자가 로그인 한 후에 내가 그를 위해 필요한 방을 어떻게 만들 수 있습니까? 나는 이벤트를 게시 할 수 있다고 생각하고 있었는데이 (UserCreatedEvent)을 기반으로 방을 만들었습니다 ... 올바른 방향으로 가고 있습니까?

답변

2

예, 올바른 방향입니다.

여러 집계에 걸쳐있는 프로세스의 경우 Saga/Process manager을 사용할 수 있습니다. 이 구성 요소는 관련 이벤트 (예 : UserCreatedEvent)를 수신하여 작동하며 관련 집계에 명령을 전송합니다. 귀하의 경우, 사가 (Saga)는 생성해야하는 모든 객실에 대해 하나 이상의 CreateRoom 명령을 전송합니다.

이 프로세스는 궁극적으로 일관성이 있습니다. 즉, 이벤트가 방출 된 후 명령이 전송 될 때까지 시간 지연이 있습니다.

1

내가 보는 방식으로 사용자는 어떤 방에도 없습니다. 그러나 그는 방안에 게시 된 모든 메시지를 수신하기 위해 구독 할 수 있습니다. 구독은 사용자와 회의실 간의 조정자로 만들 수 있습니다. 그리고 그들은 다 닳아서 삭제 될 수 있습니다. 그들이 수행하는 유일한 정보는 방과 사용자와의 관계 (그리고 유효 기간) 일 뿐이며, ID, 값 객체이기 때문에 ID가 없습니다.

방을 참조하는 사용자는 피하고 싶지만 중간에 값 개체가 있으면 확인하십시오. 그러면 구독이 도움이됩니다.

+0

정말 좋은 방법입니다 ... 나는 그것에 잠을 자고, 내가 뭘 할 수 있는지 보자! 그러나 하나의 질문 : ID가없는 경우 어떻게 관계를 구축 할 수 있습니까?이 정보를 저장해야합니다. –

+1

@ElementCollection을 살펴보아야합니다. 이것이 전체 Project에서 오류로 가득 찬 japa 플러그인을 사용하지 못한다면 JPA Entity로 모델링 할 수 있습니다. 데이터베이스에 ID를 저장하는 기술 ID가 있다고해서 도메인에 ID가 있다는 것을 의미하지는 않습니다. ... id 필드를 비공개로 만들고 setter/getter -methods를 id에 추가하지 않아도됩니다. – EasterBunnyBugSmasher