이것은 다소 복잡 할 수 있으므로 내 상황을 설명하기 위해 최선을 다할 것입니다.이 게시물도 내 첫 번째 게시물이기 때문에 서식 실수 등을 용서하십시오! 에서 참조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
와
감사합니다.이 옵션이 될 수도 있지만 가능한 모든 경우 InheritanceType.JOINED로 유지하고 싶습니다. 행동의 수는 상당히 커질 수 있으며 각각은 많은 특정 필드를 가질 수 있으므로 테이블의 거대한 괴물을 피하려고합니다! – DaveyDaveDave
@DaveyDaveDave 그런 다음 상속 유형이 혼합되어 있어야합니다. 내 업데이트를 확인하십시오. – Bozho
감사합니다 Bozho, 이것은 내가 찾고있는 것을했을 수도있는 것처럼 보이지만, 나를 위해 일한 것처럼 보이는 간단한 옵션을 발견했습니다. 그래서 그것에 충실 할 것입니다.하지만 내 것이 증명된다면 당신의 마음을 감쌀 것입니다. 나중에 일하지 않기. 위의 솔루션을 읽지 않고 눈부시게 어리석은 일이 있으면 알려 주시면 큰 도움이됩니다. 감사! – DaveyDaveDave