2016-07-23 4 views
1

주문과 요청을 연결하는 가장 좋은 방법을 알고 싶습니다. Order 클래스는 다음과 같습니다최대 절전 모드 매핑 OneToMany + 상속

@Entity 
@Table(name = "Orders") 
public class Order { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

} 

나는

@Entity 
@DiscriminatorValue("Edit") 
public class EditRequest extends Request { 

@ManyToOne(targetEntity = Order.class, fetch = FetchType.EAGER) 
@JoinColumn(name = "newOrder_id", referencedColumnName = "id") 
private Order newOrder; 
} 

가 그리고 내가 가지고있는 또 다른 Order 속성을 취하는 Order 속성

@Entity 
@Table(name = "Requests") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="request_type",discriminatorType=DiscriminatorType.STRING) 
public class Request { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@ManyToOne(targetEntity = Order.class, fetch = FetchType.EAGER) 
@JoinColumn(name = "oldOrder_id", referencedColumnName = "id") 
private Order oldOrder; 
} 

내가 Request의 서브 클래스가 걸리는 클래스가 다른 서브 클래스 (CancelRequest)는 Requestwh ich doesnt는 Order 속성을 가져 간다. Order 클래스에 내가 넣어 경우

이 이해가되지 않습니다 : 주문이 유형 Collection<Request>의 하나의 속성을 가져야한다

@OneToMany(mappedBy="oldOrder") 
private Collection<Request> requests; 

@OneToMany(mappedBy="newOrder") 
private Collection<EditRequest> editRequests; 

때문입니다.

그럼 Order 클래스에 무엇을 넣어야합니까?

+0

주문에 유형 컬렉션 의 속성이 하나만 있어야하는 이유를 설명 할 수 있습니까? – davidxxx

답변

2

먼저 그리고 상속 주석과 id 필드를 보유하기위한 추상 슈퍼 클래스를 만들

public interface Request { 

    public Long getId(); 

    public Order getNewOrder(); 

    public Order getOldorder(); 
} 

요청

위한 인터페이스를합니다.
@Entity 
@DiscriminatorValue("Edit") 
public class EditRequest extends AbstractRequest implements Request { 

    @ManyToOne(targetEntity = Order.class, fetch =FetchType.EAGER) 
    private Order newOrder; 

    @ManyToOne(targetEntity = Order.class, fetch =FetchType.EAGER) 
    private Order oldOrder; 

    public Order getNewOrder() { 
     return neworder; 
    } 

    public Order getOldOrder() { 
     return oldOrder; 
    } 
} 

@Entity 
@DiscriminatorValue("Cancel") 
public class CancelRequest extends AbstractRequest implements Request { 

    public Order getNewOrder() { 
     return null; 
    } 

    public Order getOldOrder() { 
     return null; 
    } 
} 

그런 다음 당신은 단지 대상 개체로 AbstractRequest 클래스와 Order 클래스에서 인터페이스를 참조 할 수 EditRequest 및 CancelRequest

:
@Entity 
@Table(name = "Requests") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="request_type",discriminatorType=DiscriminatorType.STRING) 
public class AbstractRequest { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
} 

그런 다음 두 imlpementing 수업을합니다.

@OneToMany(mappedBy="order" targetEntity = AbstractRequest.class, fetch = FetchType.EAGER) 
private Collection<Request> requests; 
+0

감사하지만 EditRequest 클래스에도 oldOrder 특성이 있어야하므로 문제가 해결되지 않습니다. –

+0

CancelRequest에 Order가 적용 가능하지 않은 경우 jdk8을 사용하는 경우 null 또는 선호하는 경우 Optional.empty()를 반환 할 수 있습니다. 내 대답을 봐. – xperjon