2012-11-01 4 views
0

Vehicle 도메인 객체를 만들어야합니다. 모든 Vehicle 객체에는 약 5 개의 속성이 있습니다. 큰 문제는 아닙니다. @Entity로 클래스에 주석을 달고, @Id로 주석을 붙인 id를 때려 눕힌다. 내 문제는 내가 알아야 할 두 종류의 특수 차량이 있다는 것입니다. 하나는 2 개의 추가 문자열 값을 보유해야하고 다른 하나는 문자열 목록을 보유해야합니다.Hibernate ORM 디자인 전략

findAll()을 수행하고 모든 차량을 얻을 수 있기를 바란다. 그래서 다른 두 가지 유형의 차량에 대한 완전히 별개의 도메인 객체를 작성하고 완전히 별도의 테이블을 가지고 판매하지는 않는다. . 나는 "AdditionalProperties"추상 클래스를 생성하고, 그것을 Vehicle의 멤버로 만든 다음, 두 개의 특수 차량을 위해 확장하는 아이디어로 주위를 놀랐지 만, 주석을 붙이고 데이터베이스에 매핑하는 적절한 방법으로 신속하게 길을 잃었습니다. 하지만 심지어 vechicle 타입을 확인하고 그 클래스 등을 캐스팅하기 위해 수많은 모 놀리 식 if 문을 쓰는 것에 매달릴 것입니다.

다른 생각은 제가 지금 가지고있는 하나의 Vehicle 도메인 객체에 추가 필드를 포함하는 것입니다 (심지어 그들은 모든 다른 유형의 차량에 대해 아무런 의미도 갖지 않지만) 특수 차량 중 하나 인 경우를 제외하고는 값을 null로 두십시오.

아무에게도 접근 방법에 대한 아이디어가 있습니까? 예를 들어 클래스에 주석을 추가하는 방법에 대한 몇 가지 예가있을 수 있습니까?

답변

3

Vehicle의 하위 클래스 두 개를 만들고 추가 속성을 포함하는 이유는 무엇입니까? Hibernate는 상속을 잘 지원합니다. 당신은 개체의 상속 트리 유지하는 세 가지 옵션이 있습니다 : 하나의 테이블 (종종 가장 빠르고 간단한 방법)에

  • 모든 공통 테이블
  • 자신의 테이블에있는 모든 개체
  • 일반적인 특성 , 그리고 자신의 테이블에 추가 하위 엔터티 속성.

어떤 솔루션을 선택 하든지 차량을 선택하면 기준을 충족하는 모든 종류의 차량이 선택됩니다. Hibernate 질의들은 다형 적이다.

the documentation을 읽으십시오.

+0

@MappedSuperclass로 차량에 주석을 추가해야합니까? 그렇게하면 확장되지 않은 Vehicle 클래스를 인스턴스화하거나 지속시킬 수 있습니까? 아니면 둘 다 @Entity로 주석을 달았습니까? 나는 그들이 같은 테이블에 모두있는 첫 번째 옵션으로 가고 싶다고 생각한다 ... – Bal

+0

No. MappedSuperclass와 Entity는 배타적이다. MappedSuperclass는 일반적인 persistent 필드를 상속 받고 싶다면 (예를 들어,'lastModified' 필드를 가진 BaseEntity 클래스를 사용하는 것과 같이), 그렇지 않으면 관련없는 엔티티로 상속 받기를 원할 때 사용됩니다. 귀하의 경우에는 기능 상속이 있으며 엔터티를 사용해야합니다. Vehicle 클래스가 asbtract가 아니고 yes이면 하위 엔티티 인스턴스 외에도 Bare Vehice 인스턴스를 유지할 수 있습니다. Vehicle을 포함한 모든 엔티티는 엔티티 주석이 있어야합니다. –

+0

설명서의 예제를 완벽하게 작동합니다. 나는 타입 Vehicle을 리턴하는 팩토리를 만들었지 만 전달 된 타입을 기반으로 적절한 concrete 클래스를 생성하고 리턴한다. 저는 AJAX를 클라이언트에게 반환하기 위해 Spring을 사용합니다. 그리고 Vehicle 컬렉션을 가지고 있지만, 자동으로 구체적인 구현 클래스를 인식하고 각각에 대한 추가 값을 반환합니다. 고마워요! – Bal

관련 문제