2009-02-27 2 views
11

누구나 이 있으십니까?은 ORM 도구에 대한 상속 지원을 원했고 사용 했습니까? 그렇다면 어떤 것이 최선의 지원이라고 생각하십니까?ORM 상속

ORM 상속은 "하늘의 원형"개념입니까? 도메인 클래스에서 상속을 의미하는 경우

+0

당신이 ORM 상속에 의해 무엇을 의미합니까 상속

, 당신은 이런 식으로 뭔가를 할 거라고? –

+0

다른 엔티티 클래스에서 파생 된 엔티티 클래스를 가질 수 있습니다. –

답변

5

나는이 질문을 많이 좋아한다. 나는 잠시 동안 ORM 도구 (Toplink, 지금은 eclipselink, Hibernate)를 사용해 왔지만 JPA 문서에서 언급 된 것처럼 항상 보았다. 그러나 나는 그것을 실제로 필요로하지 않았다. 기본적으로 ORM은 데이터베이스에 대한 레코드를 가져 오기 위해 tedius 코드를 작성하지 못하도록 막을 내릴 철학입니다. 그건 정말 큰 timesaver이며 그것은 당신이 어리석은 실수를하지 못하게합니다. 물론 이것으로 멋진 것들을 할 수는 있지만 컨트롤러에 저장하지 않는 이유는 MVC를 따르는 것보다 모델에 고정시키는 것입니다.

+0

전통적인 "하나의 클래스 당 테이블"접근 방법이 대부분의 경우에 효과가 있다고합니까? –

+1

내 경우에는 그것이 항상 내가 발견 한 것입니다. 상속을 사용하면 매핑 IMO가 혼란스러워서 유용한 것 이상의 장난감이됩니다. – GBa

3

, 내가 NHibernate에 및/또는 성 액티브로 모든 시간을 사용하여, 그들은 세 가지 매핑 전략을 지원합니다

+0

감사합니다. 나는 그들을 확인해 보겠습니다. –

+0

@Mauricio 우리는 '마스터'라고 부르는 레코드 유형을 가진 프로젝트를 진행 중입니다. 약 17 가지 유형의 마스터 레코드가 있으며, 대부분 유사한 데이터 필드가 있지만 각 필드에는 하나 또는 두 개의 고유 한 필드가있을 수 있습니다. 앞의 사람들은 상속을 사용하여 17 개의 엔티티 하위 클래스가있는 마스터 엔티티 클래스를 만들었습니다. 그것은 처음에는 훌륭하게 보였지만 잠시 동안 작업 한 후에는 null 값을 허용하는 하나의 '마스터'테이블이 더 좋지 않을 수 있는지 궁금합니다.데이터베이스에 17 개의 다른 테이블이 있습니다. 한 유형을 다른 유형으로 쉽게 변경할 수 없습니다). 나는 정말로 당신의 생각에 감사 할 것입니다. – theblang

+0

@mattblang 안녕하세요 매트, 매핑 전략과 도메인 클래스의 상속을 혼동하지 마십시오. 개별 테이블이나 단일 테이블에 매핑 된 17 개의 서브 클래스가있을 수 있으므로 참조를 위해 NHibernate 문서를 확인하십시오. 하나의 유형을 다른 유형으로 변경해야하는 경우, 일반적으로 상속과 특히 클래스 당 테이블이 잘 작동하지 않는다는 것을 이미 알고있었습니다. –

6

나는 Hibernate (그리고 Django와 함께)에서 상속을 사용했고, 그것을 유감스럽게 후회했다.

"상속을 통한 구성"원칙은 특히 도메인 클래스에 해당됩니다. 상속이 모델 수준에서 의미가있는 몇 가지 사례가 있다는 것에 동의하지만 대부분의 경우 상속은 매우 정적 인 도메인 모델을 제공하며 한 개체는 다른 클래스로 변경할 수 없습니다.

또한 대부분의 개발자는 데이터베이스 수준에서 상속 개념에 만족하지 않으므로 유지 관리가 더욱 복잡해집니다.

마지막으로, Hibernate에 의해 배치 된 프록시가 객체의 실제 클래스를 숨길 것 같은 기술적 문제가 있습니다. 그것은 "의 인스턴스"가 비정상적으로 행동하게 만듭니다. 물론 "인스턴스"가 코드 냄새라고 말할 수 있습니다. 아마도 컴포지션이 더 나은 솔루션 일 수 있다는 또 다른 힌트 일 수 있습니다.

+0

똑같은 표 당 (표정과 함께) 보이는 것이 내가 여기서 읽고있는 것에서 갈 길입니다. 통찰력에 감사드립니다. –

+0

동의하지 않습니다. 하나의 클래스에서 다른 클래스로 엔티티를 변경할 수 없다는 것을 명심한다면, 이는 공통된 OOP 지식을 다른 관계형 모델에 적용 할 수있게 해주는 매우 강력한 기술입니다. –

+0

프록시 뒤에있는 실제 유형을 확인하는 것은 아주 냄새가 난다. 방문객이나 다형성을 사용하라. http://www.hibernate.org/280.html –

1

복잡한 비즈니스 소프트웨어를 작성하는 경우 필요합니다.

개인이나 단체에 물건을 판매하고 싶다고 가정 해 보겠습니다. 판매 주문에서 구매자는 하나가 될 것입니다. 상속 재산이 없으면 어떻게합니까?

@Entity 
@Inheritance 
public abstract class Party { 

    @Id 
    private Long id; 

    ... 
} 

@Entity 
public class Individual extends Party { 
    ... 
} 

@Entity 
public class Organization extends Party { 
    ... 
} 

@Entity 
public class SalesOrder { 

    private Party buyer; 

    ... 
} 

그런 다음 당신이 할 수 있습니다 :

salesOrder.setBuyer(someOrganization) 또는 salesOrder.setBuyer(someIndividual)