I need to work with existing database tables with JPA. The tables are using composite primary keys. The foreign key attributes overlap with the primary key of the table.
Simplified example, each 'Order' has many 'OrderItems'
Table Order Table OrderItem
------------------- ----------------------
businessDomain (PK) businessDomain (PK/FK)
orderId (PK) oItemId (PK)
field1 orderId (FK)
field2 ... description ...
I created following Entities and ID-classes:
// ============== 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
}
But that doesn' work. So what do I need to do to to get a correct mapping from orderItem to order with respect to the overlapping and composite keys?
Thank you for any help. Daniel
EDIT:
Ok, here is another attempt that seems to work. Further testing required.
// ============== 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
}
Your foiegn key is just busindessDomain
and not OrderId
. Can you try this?
@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;
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.