Могу ли я вернуть Hibernate Entities в качестве возвращаемого значения в методы веб-службы JAXWS? - PullRequest
3 голосов
/ 18 апреля 2011

Может ли кто-нибудь мне сказать, что я могу вернуть Hibernate Entities в качестве возвращаемого значения в методах веб-службы JAXWS!?

Действительно, у меня есть несколько сущностей, подобных этим:

@Entity
public class Parent {
...
    private Childone childoneByChildoneid;    
    @ManyToOne
    public
    @javax.persistence.JoinColumn(name="ChildOneId",referencedColumnName="Id")
    Childone getChildoneByChildoneid() {
        return childoneByChildoneid;
    }    
    public void setChildoneByChildoneid(Childone childoneByChildoneid) {
        this.childoneByChildoneid = childoneByChildoneid;
    }
...
}

@Entity
public class Childone {
...
    private Collection<Parent> parentsById;
    @OneToMany(mappedBy = "childoneByChildoneid")
    public Collection<Parent> getParentsById() {
        return parentsById;
    }
    public void setParentsById(Collection<Parent> parentsById) {
        this.parentsById = parentsById;
    }
...
}

Итакой сервис:

@Stateless
@WebService()
public class MasterDataService {
    @EJB
    private MasterDataManager manager;
    @WebMethod
    public Parent getParent(int parentId) {
        return manager.getParent(parentId);
    }
}
@Stateless
public class MasterDataManager {
    @PersistenceContext
    EntityManager em;

    public Parent getParent(int parentId) {
        Parent parent = (Parent) em.createQuery(
            "select p from Parent p where p.id=:parentId")
            .setParameter("parentId", parentId).getSingleResult();
        return parent;
    }
}

Когда я вызываю этот веб-метод из клиента, я получаю исключение LazyInitializationException: (

Я тестирую интерфейсы Serializable и Cloneable и переопределяю метод клонирования, но, к сожалению, этого не происходитЯ использую em.detach (parent) в менеджере, но он все еще не работает.

Может ли кто-нибудь мне помочь?

tnax

1 Ответ

7 голосов
/ 18 апреля 2011

Это спорно.Обычно у вас есть два варианта:

  • вернуть объекты, но убедитесь, что они инициализированы.Либо пометьте @*ToMany с помощью fetch=FetchType.EAGER, либо используйте Hibernate.initialize(..).Причиной исключения является то, что по умолчанию все коллекции в сущностях не выбираются из базы данных, пока не будет запрошено.Но когда вы запрашиваете их у сериализатора jax-ws, сеанс гибернации уже закрыт.Технически, у вас может быть немного OpenSessionInViewIntercepetor, но я не думаю, что есть что-то готовое для использования с JAX-WS, и это может быть проблемой, чтобы написать его.Если вы не хотите передавать эти коллекции, вы можете пометить их с помощью @XmlTransient (или @JsonIgnore, в зависимости от метода сериализации).Это делает объект несколько беспорядочным, но я все же предпочитаю дублирование кода.

  • Использовать DTO (объекты передачи данных) - переносить все данные из объекта в новый объект спохожая структура, которая будет представлена ​​веб-сервисом.Опять же, вам нужно будет убедиться, что вы заполняете DTO, когда сеанс гибернации активен

Я предпочитаю первый вариант, потому что он требует меньше кода биопрограммы, но согласеночень осторожны с управлением состоянием объекта при его использовании.

...