Criei um DAO genérico que é acessado pelos DAOs das minhas classes de entidade.
Conforme mostrado nesse link, usei uma instância nova do EntityManager para cada consulta ou alteração no bd. O problema é que ao usar many to many com fetch type lazy ocorre uma exceção ao tentar obter a coleção, pois o EntityManager já foi fechado.
Exemplo:
Order order = null;
try{
order = em.find(Order.class, orderId);
}finally{
em.close();
}
// Gera exceção porque o EntityManager foi fechado
List<Item> itens = order.getItemCollection();
Segue um dos métodos que uso. Se eu comentar em.close() funciona corretamente
public static List getResultList(String namedQuery)
throws SPDNoResultException
{
EntityManager em = getEntityManager();
try
{
List resultList = em.createNamedQuery(namedQuery).getResultList();
if(resultList.isEmpty())
{
throw new SPDNoResultException();
}
return resultList;
}
finally
{
em.close();
}
}