Я бы не советовал смешивать JAXB и JPA в одном классе.
JPA-объекты имеют собственный особый жизненный цикл.Если вы возвращаете сущность JPA из общедоступного метода EJB, в большинстве случаев он отключается.Я предполагаю, что ваши REST Resource классы являются EJB.Объект JPA отсоединен, потому что по умолчанию ваша транзакция начинается и заканчивается вызовом общедоступного метода EJB.Для получения дополнительной информации посмотрите JavaDoc для TransactionAttribute .Если объект JPA отсоединен, отложенная загрузка больше не будет работать.Это ваша проблема.
Я бы предложил иметь отдельные классы для сущностей JPA и сущностей JAXB.Кроме того, я бы предложил никогда не возвращать сущность JPA из контекста транзакции.Таким образом, вам никогда не придется иметь дело с отделением / объединением сущностей JPA.Все ваши проблемы с ленивой загрузкой были бы историей.Для этого вам нужно вручную преобразовать вашу сущность JPA в вашу сущность JAXB внутри транзакции (внутри общедоступного метода EJB) и вернуть сущность JAXB.
Ваш метод GET может выглядеть следующим образом:
@GET
@Produces("application/xml")
public JaxbProduct get(@PathParam("id") int id) {
JpaProduct product = entityManager.find(JpaProduct.class, id);
JaxbProduct result = new JaxbProduct();
result.setPropertyX(product.getPropertyX());
return result;
}
Путем ручного преобразования вашей сущности JPA в сущность JAXB вы получаете полный контроль над тем, что попадает в ваш вывод, а что нет.