Мне нужно работать с существующими таблицами базы данных с JPA. В таблицах используются составные первичные ключи. Атрибуты внешнего ключа перекрываются с первичным ключом таблицы.JPA @OneToMany с составным PK-PK/FK перекрытием
упрощенный пример, каждый 'Order' имеет много '' ТоварыЗаказа
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 для заказа относительно перекрывающихся и составных клавиш?
Благодарим за помощь. Daniel
EDIT:
Хорошо, вот еще одна попытка, которая, кажется, работает. Требуется дальнейшее тестирование.
// ============== 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
}
Я думаю, что мне нужно и, businessDomain И OrderId ссылаться на заказ. Только с businessDomain я получаю миллионы заказов для каждого элемента orderItem. – reindan
Извините. orderId также требуется, чтобы я неправильно понял отношения. Просто добавив orderId в качестве referencecolumn, вы должны это сделать. – Rohit