I have a JPA entity called 'Order'. When an Order is 'renewed' (copied with minor changes), I store a reference to the original Order in the 'renewed' Order.

JPA Entity reference:

@ManyToMany
@JoinTable(name = "OP_ORDER_RENEWAL", joinColumns = @JoinColumn(name = "ORDER_ID"), inverseJoinColumns = @JoinColumn(name = "RENEWED_ORDER_ID"))
private List<Order> renewedOrders = new ArrayList<Order>();

'Renew' method:

@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;
}

Whenever I try to access the Renewed Orders list with a getter method:

public List<Order> getRenewedOrders() {
      return renewedOrders;
}

I get a 'failed to lazily initialize a collection of role' error. After googling this error I decided that my best option would be to use a seperate NamedQuery to get the RenewedOrders:

@NamedQuery(name = "Order.getRenewedOrders", query = "select o from Order o join fetch o.renewedOrders where o.id = :orderId")

When I use that NamedQuery, the query returns the Order itself, instead of its renewed orders.

有帮助吗?

解决方案

The query that ended up working for me:

select r from Order o left outer join o.renewedOrders r where o.id =:orderId 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top