Hibernate Mapping OneToMany +继承

时间:2016-07-23 15:48:33

标签: hibernate jpa inheritance mapping

我想知道在我的订单和请求之间进行映射的最佳方式。 Order类是:

@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的另一个子类(Request)并没有Order属性。

如果在我提出的Order课程中

,那就没有意义了
@OneToMany(mappedBy="oldOrder")
private Collection<Request> requests;

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

因为订单只应包含一个Collection<Request>类型的属性。

那么我应该在我的Order课程中加入什么?

1 个答案:

答案 0 :(得分:2)

首先为Request

创建一个接口
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;