JPA : 모델 계층 구조 구현-@MappedSuperclass 대 @Inheritance
Play Framework 1.2.4를 PostgreSQL
및 JPA
. 모델 계층 구조를 갖고 있으며이를 수행하는 몇 가지 대안이 있는지 확인하고 싶습니다.
기본 클래스 (추상적 임)와이 기본 클래스를 확장하는 두 개의 구체적인 클래스가 있습니다. 구체적인 클래스를 갖고 싶은 동안이 기본 클래스를 유지하고 싶지 않습니다. 기본 클래스에는 다른 Model 클래스가 속성으로 있습니다. 즉, @ManyToOne
기본 클래스에 관계가 있습니다.
내 질문은 이것을 구현하는 가장 좋은 방법은 무엇입니까? 사용 @MappedSuperclass
또는 @Inheritance
과 TABLE_PER_CLASS
전략? 나는 그들이 거의 동등 해 보이기 때문에 약간 혼란 스럽습니다 .
또한 앞으로 직면 할 수있는 쿼리 및 성능 문제에 대한 우려도 있습니다.
MappedSuperClass는 속성, 연결 및 메서드를 상속하는 데 사용해야합니다.
엔터티 및 여러 하위 엔터티가있는 경우 엔터티 상속을 사용해야합니다.
다음 질문에 답하여 둘 중 하나가 필요한지 알 수 있습니다. 모델에 기본 클래스와 연관 될 수있는 다른 엔티티가 있습니까?
그렇다면 기본 클래스는 실제로 엔티티이며 엔티티 상속을 사용해야합니다. 그렇지 않은 경우 기본 클래스는 실제로 관련되지 않은 여러 엔터티에 공통적 인 속성 및 메서드를 포함하는 클래스이며 매핑 된 수퍼 클래스를 사용해야합니다.
예를 들면 :
- SMS 메시지, 이메일 메시지 또는 전화 메시지와 같은 여러 종류의 메시지가있을 수 있습니다. 그리고 사람에게는 메시지 목록이 있습니다. 메시지 종류에 관계없이 미리 알림을 메시지에 연결할 수도 있습니다. 이 경우 Message는 분명히 엔터티이며 엔터티 상속을 사용해야합니다.
- 모든 도메인 개체에는 생성 날짜, 수정 날짜 및 ID가있을 수 있으므로 기본 AbstractDomainObject 클래스에서 상속하도록 만들 수 있습니다. 그러나 어떤 엔티티도 AbstractDomainObject에 연결되지 않습니다. 항상 고객, 회사 등보다 구체적인 개체와 연결됩니다. 이 경우 MappedSuperClass를 사용하는 것이 좋습니다.
나는에서 설명하고있는 바와 같이 이 문서 , @MappedSupperclass
댄 다른 @Inheritance
주석.
@MappedSuperclass
JPA 공급자에게로 주석이 추가 된 수퍼 클래스를 확장하는 자식 클래스에서 선언 한 것처럼 기본 클래스 영구 속성을 포함하도록 지시합니다 @MappedSuperclass
.
그러나 데이터베이스 관점에서 기본 클래스가 표시되지 않기 때문에 상속은 OOP 세계에서만 볼 수 있습니다. 하위 클래스 엔터티에만 연결된 매핑 된 테이블이 있습니다.
@Inheritance
주석은 데이터베이스 테이블 구조의 OOP의 상속 모델을 실현하기위한 것입니다. 또한으로 주석이 달린 기본 클래스를 쿼리 할 수 @Inheritance
있지만 주석이 달린 기본 클래스에 대해서는 그렇게 할 수 없습니다 @MappedSuperclass
.
이제 @Inheritance
JPA 주석 을 사용하려는 이유 는 Strategy Pattern과 같은 동작 기반 패턴을 구현하기위한 것 입니다.
반면 @MappedSuperclass
에은 (는) 기본 속성, 연결 및 @Id
공통 기본 클래스를 사용하는 엔터티 를 모두 재사용하는 방법 일뿐 입니다. 그럼에도 불구하고 @Embeddable
유형을 사용하여 거의 동일한 목표를 달성 할 수 있습니다 . 유일한 주요 차이점은를 사용하여 @Id
정의를 재사용 @Embeddable
할 수는 없지만 @MappedSuperclass
.
'IT TIP' 카테고리의 다른 글
C ++에서 c_str 함수의 사용은 무엇입니까 (0) | 2020.12.14 |
---|---|
node.js에서 내 스크립트가 직접 실행되고 있는지 또는 다른 스크립트에 의해로드되고 있는지 알 수 있습니까? (0) | 2020.12.14 |
WAS (Windows Process Activation Service)에서 응용 프로그램 풀을 제공하기 위해 작업자 프로세스를 시작할 때 오류가 발생했습니다. (0) | 2020.12.14 |
함수에 매개 변수로 전달하지 않고 Spring에서 현재 사용자 로케일을 얻는 방법은 무엇입니까? (0) | 2020.12.14 |
벡터의 값을 기반으로 데이터 프레임에서 행 선택 (0) | 2020.12.14 |