[英]JPA @OneToMany with composite PK - PK/FK overlapping
我需要使用JPA处理现有的数据库表。 这些表使用复合主键。 外键属性与表的主键重叠。
简化示例,每个“订单”都有许多“ OrderItems”
Table Order Table OrderItem
------------------- ----------------------
businessDomain (PK) businessDomain (PK/FK)
orderId (PK) oItemId (PK)
field1 orderId (FK)
field2 ... description ...
我创建了以下实体和ID类:
// ============== Order Entity ======================
@Entity
@IdClass(OrderId.class)
public class Order implements Serializable {
@Id
private long busindessDomain;
@Id
private long orderId;
private String field1;
private String field2;
//Getters/Setters
}
// ============== OrderItem Entity ==================
@Entity
@IdClass(OrderItemId.class)
public class OrderItem implements Serializable {
@Id
private long busindessDomain;
@Id
private long oItemId;
private String description;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="orderId", referencedColumnName="orderId", insertable=false, updatable=false)
private Order order;
//Getters/Setters
}
// ============== OrderId class =====================
public class OrderId implements Serializable {
private long busindessDomain;
private long orderId;
//Getters/Setters
}
// ============== OrderItemId class =================
public class OrderId implements Serializable {
private long busindessDomain;
private long oItemId;
//Getters/Setters
}
但这行不通。 那么,对于重叠键和组合键,我需要怎么做才能从orderItem到订单正确映射呢?
感谢您的任何帮助。 丹尼尔
编辑:
好的,这是另一种似乎可行的尝试。 需要进一步测试。
// ============== Order Entity ======================
@Entity
@IdClass(OrderId.class)
public class Order implements Serializable {
@Id
private long busindessDomain;
@Id
private long orderId;
private String field1;
private String field2;
@OneToMany(targetEntity=OrderItem.class, mappedBy="order")
private List<OrderItem> orderItems;
//Getters/Setters
}
// ============== OrderItem Entity ==================
@Entity
@IdClass(OrderItemId.class)
public class OrderItem implements Serializable {
@Id
private long busindessDomain;
@Id
private long oItemId;
private String description;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="businessDomain", referencedColumnName="businessDomain"),
@JoinColumn(name="orderId", referencedColumnName="orderId")
})
private Order order;
//Getters/Setters
}
您的密钥仅是busindessDomain
而不是OrderId
。 你可以试试这个吗?
@Entity
public class Order {
@EmbeddedId
private OrderPk orderId;
//getter/setter...
@Embeddable
private static class OrderPk {
private long busindessDomain;
private long oItemId;
}
}
OrderItem的:
@Entity
public class OrderItem{
@EmbeddedId
private OrderItemPk orderTemId;
@ManyToOne
@JoinColumns(value = { @JoinColumn(referencedColumnName = "businessDomain", name="businessDomain")})
private Order order;
getter/setter...
@Embeddable
private static class OrderItemPk{
private long busindessDomain;
private long oItemId;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.