2014-01-21 2 views
13

JPA에서 테이블 당 하나의 저장소가 있어야합니까? 그렇지 않다면 저장소 데이터베이스에서 제네릭을 어떻게 해결할 수 있습니까?JPA에서 테이블 당 하나의 저장소가 있어야합니까?

예를 들어, 아래는 StoreRepository입니다. Store 개체에 대해 CRUD 작업을 처리합니다. 저장소에 StoreEvent 객체를 저장하려면 두 객체를 모두 수용 할 수 있도록 아래 인터페이스를 어떻게 변경해야합니까?

@Repository 
public interface StoreRepository extends JpaRepository<Store, String> { 
    public Store findByGuid(String guid); 
} 

답변

23

리포지토리는 Domain Driven Design에서 파생 된 개념이므로 데이터베이스 테이블에 대해 생각하는 것은 잘못된 방법입니다. 정의에 따라 저장소에서 집계 루트에 액세스합니다. 효과적으로 리포지토리는 이러한 컬렉션을 시뮬레이트합니다.

이제 집계 루트는 무엇입니까? 아마도 더 흥미로운 것일 겁니다. 그건 물론 물론 귀하의 도메인에 따라 다르지만 여기에 한 가지 예를 들어 보겠습니다. LineItems을 포함하는 Order은 일반적으로 집계 루트로 모델링됩니다. 이것은 Order의 구성 특성 때문입니다. LineItem은 주변에 없으면 존재하지 않습니다 Order.

일반적으로 지속성 액세스 메커니즘은 도메인 원칙을 따라야합니다. 따라서 OrderLineItem을 모두 @Entity 클래스로 모델링하지만 집합 루트 형태로 OrderRepository 만 만들고 오브젝트 그래프 내에서 일관성 규칙을 효과적으로 제어합니다.

우리는 또한 강하게는 같은 가게 특정 저장소 기반 인터페이스를 사용하지 추천 - 이름에서 알 수 있듯이 - (가) 가능하면 인식 안 클라이언트에 저장 특성 (예를 들어, flush())를 노출합니다. 그 대답은 here에서 자세히 읽으십시오.

+0

상위 엔티티 순서와 독립적 인 라이프 사이클이없는 경우 LineItem을'@ Entity'로 모델링해야한다고 제안하는 이유를 잘 모르겠습니다. 필자는 정의 클래스 LineItem에서'@ Embeddable '로 모델링해야하며'@ Entity'로 모델링해서는 안된다고 생각합니다. –

관련 문제