2016-07-23 10 views
1

私は私の注文とリクエストをマップする最良の方法を知りたいと思っています。 Orderクラスは次のとおりです。HibernateマッピングOneToMany +継承

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

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

} 

私は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のこのサブクラスOrder属性

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

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

を持っており、私が持っています別のサブクラス(CancelRequest)はRequestwh ich doesntはOrder属性をとります。

Orderクラスで私が入れた場合、それは意味がありません。

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

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

を順序がタイプCollection<Request>の1つの属性のみを持っている必要がありますので。

だから、私はOrderクラスに何を入れるべきですか?

+0

注文には、タイプコレクションの属性が1つのみである必要がある理由を説明できますか? – davidxxx

答えて

2

まず次に継承注釈およびidフィールドを保持するための抽象スーパークラスを作るリクエスト

public interface Request { 

    public Long getId(); 

    public Order getNewOrder(); 

    public Order getOldorder(); 
} 

ためのインタフェースを作ります。

@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; 
} 

次に、2つのimlpementingクラスますEditRequestとCancelRequest

@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クラスからインターフェイスを参照することができます。

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

ありがとうございますが、これは問題を解決しません。なぜなら、EditRequestクラスもoldOrder属性を持つ必要があるからです。 –

+0

OrderがCancelRequestに適用されない場合は、jdk8を使用している場合はnullまたは好ましくはOptional.empty()を返すことができます。私の更新された答えを見てください。 – xperjon

関連する問題