2010-07-04 4 views
0

내 J2EE 응용 프로그램에 정확히 동일한 구현을 공유하는 약 10 개의 다른 엔터티가 있습니다. 그것들은 모두 @MappedSuperclass로 주석 처리 된 동일한 일반 추상 클래스를 상속하지만이 클래스에는 모든 구체적인 하위 클래스에서 반복 한 구현이 없습니다. 내가 할 수있는 경우구체적인 JPA 클래스간에 Java 구현을 공유하는 가장 좋은 방법은 무엇입니까?

, 나는이 추상 슈퍼 클래스의 모든 다양한 분야와 컬렉션을 넣어 때문에 너무 거기 구현 방법을 넣어 것 -으로 인해 JPA 제한으로, 그러나 10 대신 한 곳에서 모든 I cannot add JPA annotations to generic fields or accessors.

필자는 일반적으로 어쨌든 구현 상속에 위임하는 것을 좋아하지만, 컬렉션이있는 임베디드 엔티티를 가질 수 없다는 JPA의 다른 제한 사항으로 인해 델리게이트 사용에 대한 아이디어도 작동하지 않습니다.

이 엔티티 중 3-4 개와 2-3 가지 방법을 사용했을 때 큰 문제는 아니었지만 이제는 약 10-8- 약 7 가지 방법이 있습니다. 방법이 점점 복잡해지고 있습니다. 그리고 제가 사용하고있는 "cut-copy-paste"상속은 정말 짜증납니다.

다른 멋진 아이디어가 있습니까?

답변

0

JPA 주석에 속성 액세스 모드를 사용해야하는 경우 구현 상속이나 위임을 사용할 수 있습니다. JPA 주석에 필드 액세스 모드를 사용하고 있는데 일반 필드 유형에 주석을 달 수 없기 때문에 고통을 끝내지 못했습니다.

그러나 속성 액세스 모드에서는 엔티티, mappedsuperclass, embeddable 또는 기타 항목으로 주석을 추가하지 않고 일반 추상 구현을 간단하게 만듭니다. 이렇게하면 JPA는이를 무시합니다. 그런 다음 구체적인 하위 클래스에서 필요에 따라 보호 된 getter 및 setters 메서드를 만들고 JPA 주석을 해당 하위 클래스에 넣습니다.

간단한 설명으로 밝혀졌습니다.

1
  1. 이러한 "제한 사항"이 JPA 제공자에게 실제로 적용되는지 여부를 다시 확인하십시오. 필자는 콜렉션이있는 객체를 임베드했으며, Hibernate를 사용하면 괜찮습니다. 매핑 된 입력란에 @MappedSuperclass이 있습니다.

  2. @MappedSuperclass을 생략하고 적절한 상속 계층 구조를 가진 abstract@Entity 수퍼 클래스를 만들 수 있습니다.

+0

1 - "private List myfield"와 같은 제네릭 형식 매개 변수를 사용하는 매핑 된 필드가있는 수퍼 클래스를 갖고 있습니까? "T"는 추상 클래스의 매개 변수입니까? – HDave

+0

2 - 나는 그것을 시도했다. 그러나 당신의 생각은 내가 수퍼 클래스를 엔티티가 아니거나 mappedsuperclass가 아니게 만들지 않을지 궁금하게 만든다. JPA가 그것을 무시하면, 실제로 super.method()를 호출하고 구현을 모두 재사용하는 구체적인 서브 클래스에서 필드 주석 대신 속성 주석을 사용할 수 있습니다. – HDave

관련 문제