2016-07-23 148 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