2010-04-26 2 views
2

이것은 다소 복잡 할 수 있으므로 내 상황을 설명하기 위해 최선을 다할 것입니다.이 게시물도 내 첫 번째 게시물이기 때문에 서식 실수 등을 용서하십시오! 에서 참조JPA - 자체 테이블이없는 @DiscriminatorValue를 사용하여 Entity 클래스를 만들 수 있습니까?

ACTION 
--------- 
ACTION_ID 
ACTION_MAPPING_ID 
ACTION_TYPE 

DELIVERY_CHANNEL_ACTION 
-------------------------- 
ACTION_ID 
CHANNEL_ID 

OVERRIDE_ADDRESS_ACTION 
-------------------------- 
ACTION_ID 
(various fields specific to this action type) 

그래서, 일반 영어, 나는 행동의 여러 가지 유형이 모든 사진첩 ACTION_MAPPING : 내가 합류 상속과 같이 보이는 데이터베이스 구조와 JPA를 사용하고

'parent'ACTION 테이블 DELIVERY_CHANNEL_ACTION 및 OVERRIDE_ADDRESS_ACTION은 둘 다 자체의 추가 보조 데이터를 가지고 있으며 FK로 ACTION에 매핑됩니다.

실세계, 나는 또한 '억압'행동을 취하고 있지만 이것은 자체적으로 보완적인 데이터를 가지고 있지 않으므로 해당 테이블을 가지고 있지 않습니다. 필요한 것은 ACTION_MAPPING이며 저장됩니다 ACTION 테이블에 있습니다. 희망

지금까지 나와 함께있어 ...

나는 처음부터 새 프로젝트를 생성, 내가 무엇을 할 수 있는지에 매우 유연하게,하지만 분명히 처음부터 바로 그것을 좀하고 싶습니다 해요 ! 작동

나의 현재 구현은 느슨하게 다음과 같이 정의 된 세 가지 요소를 가지고있다

@Entity 
@Table(name="ACTION") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorValue("SUPPRESS") 
public class Action 

@Entity 
@Table(name="DELIVERY_CHANNEL_ACTION") 
@DiscriminatorValue("DELIVERY_CHANNEL") 
public class DeliveryChannelAction extends Action 

@Entity 
@Table(name="OVERRIDE_ADDRESS_ACTION") 
@DiscriminatorValue("OVERRIDE_ADDRESS") 
public class OverrideAddressAction extends Action 

- 내가 가입 상속 전략과 구체적인 기본 클래스, 액션을 가지고있다. DeliveryChannelAction과 OverrideAddressAction은 모두 Action을 확장합니다.

여기에 어떤 느낌이 들지만, 내 Action 클래스는이 두 가지 동작에 대한 기본 클래스이지만 억제 동작에 대한 구체적인 구현을 형성합니다.

당분간은 더 많은 작업이 추가 될 가능성이 있으며, 일부는 SUPPRESS와 같이 보완 데이터가 없기 때문에 어려워 질 수 있습니다.

그래서 ... 객체 모델 세계에서 Action을 추상화하고 @DiscriminatorValue ("SUPPRESS")를 제외하고는 비어있는 SuppressAction 클래스를 만드는 것이 좋습니다.

@Entity 
@Table(name="ACTION") 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Action 

및 작성 :

나는 조치를 변경, 상기 한 바와 정확하게 일을 시도하므로 한

@DiscriminatorValue("SUPPRESS") 
public class SuppressAction extends Action 

하지만 행운을 - DeliveryChannelAction 및 위해 잘 작동하는 것 같다 OverrideAddressAction을 사용하지만 SuppressAction을 만들고 유지하려고하면 다음과 같이 표시됩니다.

java.lang.IllegalArgumentException: Object: com.mypackage.SuppressAction[actionId=null] is not a known entity type. 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4147) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:368) 
    at com.mypackage.test.util.EntityTestUtil.createSuppressAction(EntityTestUtil.java:672) 
    at com.mypackage.entities.ActionTest.testCRUDAction(ActionTest.java:27) 

은 SuppressAction이 엔티티로 등록되어 있지 않다는 사실을 알고 있지만 관련 테이블이 없으므로 어떻게 할 수 있는지 알지 못합니다. 내 스택 트레이스를 수정 :

모든 포인터, 전체 응답 또는 Google (! 나는 아이디어 나갈거야)에 대한 것들에 대한 힌트 중 하나는, 대부분의

편집 : 환영합니다.InheritanceType.SINGLE_TABLE

답변

1

은 내가 나를 위해 작동합니다 해결책을 찾은 것 같아요, 나의 실체는 지금과 같이 : 그래서

@Entity 
@Table(name="ACTION") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorValue("SUPPRESS") 
public abstract class Action 

@Entity 
@Table(name="DELIVERY_CHANNEL_ACTION") 
@DiscriminatorValue("DELIVERY_CHANNEL") 
public class DeliveryChannelAction extends Action 

@Entity 
@Table(name="OVERRIDE_ADDRESS_ACTION") 
@DiscriminatorValue("OVERRIDE_ADDRESS") 
public class OverrideAddressAction extends Action 

@Entity 
@Table(name="ACTION") 
@DiscriminatorValue("SUPPRESS") 
public class SuppressAction extends Action 

, 기본적으로 내가, 내 SuppressAction 클래스에 '부모'테이블을 참조되었다 된 모두 I 어리석게도 일하지 않을 것이라고 생각했다. 내 모든 테스트가 이걸 통과하고 있으며 작동하는 것 같습니다. 앞으로 다른 액션을 추가해야한다면 행복 할 것 같습니다. SuppressAction의 사본은 다른 @DiscriminatorValue가 예상대로 작동하기 때문에 행복하다고 생각합니다.

1

할 수는 다른 지점에 대한 다중 상속 유형이 할 수있는 방법이 있습니다. See this question.

+0

감사합니다.이 옵션이 될 수도 있지만 가능한 모든 경우 InheritanceType.JOINED로 유지하고 싶습니다. 행동의 수는 상당히 커질 수 있으며 각각은 많은 특정 필드를 가질 수 있으므로 테이블의 거대한 괴물을 피하려고합니다! – DaveyDaveDave

+0

@DaveyDaveDave 그런 다음 상속 유형이 혼합되어 있어야합니다. 내 업데이트를 확인하십시오. – Bozho

+0

감사합니다 Bozho, 이것은 내가 찾고있는 것을했을 수도있는 것처럼 보이지만, 나를 위해 일한 것처럼 보이는 간단한 옵션을 발견했습니다. 그래서 그것에 충실 할 것입니다.하지만 내 것이 증명된다면 당신의 마음을 감쌀 것입니다. 나중에 일하지 않기. 위의 솔루션을 읽지 않고 눈부시게 어리석은 일이 있으면 알려 주시면 큰 도움이됩니다. 감사! – DaveyDaveDave

관련 문제