Hibernate 映射 OneToMany + 继承
Hibernate Mapping OneToMany + inheritance
我想知道在我的订单和请求之间映射的最佳方式。
Order
class 是:
@Entity
@Table(name = "Orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
我有一个 class 具有 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
的这个子class,它带有另一个 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;
}
我还有 Request
的另一个子 class (CancelRequest
),它没有 Order
属性。
如果在 Order
class 中输入 :
就没有意义
@OneToMany(mappedBy="oldOrder")
private Collection<Request> requests;
@OneToMany(mappedBy="newOrder")
private Collection<EditRequest> editRequests;
因为一个订单应该只有一个 Collection<Request>
类型的属性。
那么我应该在 Order
class 中输入什么?
先为Request做一个接口
public interface Request {
public Long getId();
public Order getNewOrder();
public Order getOldorder();
}
然后创建一个抽象的超级class来保存继承注解和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;
}
然后做两个实现classes: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 class 中的接口,并将 AbstractRequest class 作为目标实体。
@OneToMany(mappedBy="order" targetEntity = AbstractRequest.class, fetch = FetchType.EAGER)
private Collection<Request> requests;
我想知道在我的订单和请求之间映射的最佳方式。
Order
class 是:
@Entity
@Table(name = "Orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
我有一个 class 具有 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
的这个子class,它带有另一个 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;
}
我还有 Request
的另一个子 class (CancelRequest
),它没有 Order
属性。
如果在 Order
class 中输入 :
@OneToMany(mappedBy="oldOrder")
private Collection<Request> requests;
@OneToMany(mappedBy="newOrder")
private Collection<EditRequest> editRequests;
因为一个订单应该只有一个 Collection<Request>
类型的属性。
那么我应该在 Order
class 中输入什么?
先为Request做一个接口
public interface Request {
public Long getId();
public Order getNewOrder();
public Order getOldorder();
}
然后创建一个抽象的超级class来保存继承注解和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;
}
然后做两个实现classes: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 class 中的接口,并将 AbstractRequest class 作为目标实体。
@OneToMany(mappedBy="order" targetEntity = AbstractRequest.class, fetch = FetchType.EAGER)
private Collection<Request> requests;