Страшное Lazy Initialization Exception при использовании JAX-WS и JEE6 - PullRequest
0 голосов
/ 22 января 2011

Я получаю LIE при использовании аннотации JAX-WS @Path и @Stateless (или @RequestScoped). Код:

@Path("/users")
@Stateless
@Produces(MediaType.APPLICATION_XML)
public class UserResourceRESTService {
  @Inject
  @UserRepository
  @PersistenceContext
  private EntityManager em;

  @GET
  @Path("/{id:[1-9][0-9]*}")
  public User lookupUserById(@PathParam("id") long id) {
      return em.find(User.class, id);
  }
}

Фактическое исключение, которое я получаю:

org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса

У объекта пользователя есть адрес, в котором есть страна. Если я изменяю это на bean-компонент с состоянием и использую расширенный контекст, это работает, но это действительно не должно быть SFSB, не так ли? Я немного растерялся из-за того, что em не сможет открыть сеанс при использовании bean-компонента без состояния?

Ответы [ 2 ]

0 голосов
/ 24 января 2011

Вы также можете аннотировать свои отношения в классе пользователя с помощью fetch = FetchType.EAGER.Если вы всегда возвращаете все, нет смысла лениво загружаться, на мой взгляд.

0 голосов
/ 22 января 2011

Когда вы работаете в расширенном контексте персистентности, ваш возвращенный объект User остается в управляемом состоянии, а когда вы используете транзакцию, контекст контекста постоянства завершает транзакцию, как только возвращается метод lookupUserById (), и результатом этого метода является объект, уже отсоединенный от контекста персистентности,В результате все свойства этой сущности, помеченные как LAZY, больше не доступны.

Если вы хотите получить доступ к этим ленивым свойствам после отсоединения сущности от контекста постоянства, вызовите специальные методы получения для этой сущности, прежде чем вернуться из метода lookupUserById.

т.е.

 public User lookupUserById(@PathParam("id") long id) {
  User user =  em.find(User.class, id);
  user.getAddress().getCountry();
  return user;
}
...