2016-07-23 150 views
1

我想知道在我的訂單和請求之間映射的最佳方式。 的Order類是:休眠映射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; 
} 

而且我有另一個子類(CancelRequestRequest wh ich不需要Order屬性。

它沒有意義,如果在Order類我把:

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

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

因爲一個訂單隻能有一個Collection<Request>類型的屬性。

那麼我應該在我的Order課上放什麼?

+0

你能解釋爲什麼一個訂單應該只有一個屬性Type Collection ? – davidxxx

回答

2

首先讓一個接口,用於請求

public interface Request { 

    public Long getId(); 

    public Order getNewOrder(); 

    public Order getOldorder(); 
} 

然後作出一個抽象的超類用於保存繼承註釋和id字段。

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

然後你可以只引用從Order類的接口與AbstractRequest類爲目標的實體。

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

謝謝,但這並不能解決問題,因爲EditRequest類也應該具有oldOrder屬性。 –

+0

如果Order不適用於CancelRequest,那麼如果您使用的是jdk8,則可以返回null或優選Optional.empty()。看看我更新的答案。 – xperjon