2012-04-17 3 views
1

그래서 저는 JPA의 상속 기능에 익숙해지기 위해 노력해 왔으며 지금까지 정말 좋아했습니다. 최근에 저에게 일어난 한 가지는 데이터를 검색하는 것 이외의 다른 용도로 실제로 사용될 수 있다는 것입니다. discriminator 값을 기반으로 하위 클래스를 가져올 수 있으므로 상속은 실제로 구성 필드를 구현으로 변환하는 편리한 방법입니다. 지식과 경험의 비율이 '위험 할 정도로 충분할 때/항상 그 영역을 인식 할만큼 충분하지 않은'단계에 있기 때문에 이것이 좋은 생각인지 묻는 것이 가장 좋을 것이라고 생각했습니다.JPA 상속을 다른 메소드 구현 방법으로 사용하는 것이 이치에 맞습니까?

PRODUCT 및 BILLTYPE 테이블을 예로 들어 보겠습니다.

Product: 
int Id 
int billtypeid 

Billtype: 
int id 
varchar[15] description 

Billtype는 단순히 제품에 대한 청구 전략 (우리는 다른 사람이 단지의 경우에 의해 청구 할 수 있지만 일부 주문은, 중량 청구 할 수있다 말할 것이다). 각 청구서 유형은 인보이스 발행 과정에서 다른 방법을 사용해야합니다. Billtype 테이블에는 항목이 몇 개있을뿐 아니라 매우 커질 수 없습니다.

인보이스 코드에 필요한 메소드에 대한 인터페이스도 정의하는 추상 BillType 엔티티를 서브 클래스로 상속하는 것이 합리적일까요? 이런 식으로 뭔가 :

@Entity 
@DiscriminatorColumn("description") 
public abstract class BillType { 
    // Getters, setters 
    // Abstract methods that could be used elsewhere - ex: 
    // BigDecimal calculateInvVal(...) 
} 


@Entity 
@DiscriminatorValue("by case") 
public class CaseBillType extends BillType { 
    // Implementation of calculateInvVal - now when invoicing code needs this method, 
    // the right one is always associated with the current product! 
} 

이 구성 데이터를 나타내는 데이터베이스 필드와 행동을 연결하는 편리한 방법을 제공하지만 (대부분의 계정에 의해, 아주 아주 나쁜이다) 기관과 비즈니스 코드를 혼합합니다. 내 레퍼토리에서 빠진이 이슈를 해결할 수있는 디자인 패턴이있을 수 있지만 많은 것을 써야하는 것을 피하고 싶습니다. "청구서 유형이이 경우 청구서 유형이이 경우이 하위 클래스를 가져 오는 경우 등 "코드.

내가이 기술에 잠재적 인 단점에 대한 설명을하고 있는데,이 문제에 대한 다른 해결책을 찾는 것이 정당하다는 것을 알 수는 없을 것입니다.

답변

2

새로운 버전의 응용 프로그램을 다시 빌드하고 다시 배포 할 필요없이 런타임에 bill 유형을 추가, 제거 및 수정할 수있는 경우 제품을 BillType 엔터티와 연결하는 것이 유용합니다. 이것은 귀하의 예와 관련이 없습니다.

그렇다면 BillType 하위 클래스로 캡슐화 된 정적 동작을 정의하는 정적 bill types 집합이 있으면 대신 BillType enum을 사용할 수 있습니다. 이 enum의 각 인스턴스는 자체 동작을 정의합니다. 엔티티 계층 구조와 이에 대한 추가 표가 필요하지 않습니다.

정확히 같은 것이다 제품 엔티티에 inval이를 계산하는 코드 :

BigDecimal computeInVal() { 
    billType.calculateInVal(this); 
} 

코드는 얻을 모든 법안 유형은 다음 코드의

return BillType.values(); 

대신 할 것 제품에 청구 유형을 연결하려면 :

product.setBillType(em.find(BillType.class, ID_OF_CASE_BILL_TYPE)); 

product.setBillType(BillType.BY_CASE); 
관련 문제