0

「注文」という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 を使用すると、クエリは、更新された注文ではなく、注文自体を返します。

4

1 に答える 1