「注文」というJPAエンティティがあります。注文が「更新」(小さな変更を加えてコピー) されると、元の注文への参照が「更新された」注文に保存されます。
JPAエンティティ参照:
@ManyToMany
@JoinTable(name = "OP_ORDER_RENEWAL", joinColumns = @JoinColumn(name = "ORDER_ID"), inverseJoinColumns = @JoinColumn(name = "RENEWED_ORDER_ID"))
private List<Order> renewedOrders = new ArrayList<Order>();
「更新」方法:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Order renewOrder(Order originalOrder) {
Order newOrder = new Order();
..............
List<Order> listOfOrdersThisOrderIsRenewing = new ArrayList<Order>();
listOfOrdersThisOrderIsRenewing.add(originalOrder);
newOrder.setRenewedOrders(listOfOrdersThisOrderIsRenewing);
em.persist(newOrder);
return newOrder;
}
getter メソッドを使用して Renewed Orders リストにアクセスしようとすると、次のようになります。
public List<Order> getRenewedOrders() {
return renewedOrders;
}
「ロールのコレクションを遅延初期化できませんでした」というエラーが表示されます。このエラーをグーグルで調べた後、別の NamedQuery を使用して RenewedOrders を取得するのが最善の方法であると判断しました。
@NamedQuery(name = "Order.getRenewedOrders", query = "select o from Order o join fetch o.renewedOrders where o.id = :orderId")
その NamedQuery を使用すると、クエリは、更新された注文ではなく、注文自体を返します。