java – 我可以在JAXWS Web服务方法中返回Hibernate Entities作
任何人都可以告诉我,我可以将Hibernate实体作为JAXWS Web服务方法中的返回值返回!
的确,我有一些这样的实体: @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; } } 当我从客户端调用此Web方法时,我得到LazyInitializationException异常:( 我测试Serializable和Cloneable接口并覆盖克隆方法但不幸的是它不起作用,我在管理器中使用em.detach(父),但它仍然不起作用. 谁能帮我? tnax 解决方法
这是值得商榷的.通常,您有两种选择:
>返回实体,但要确保它们已初始化.使用fetch = FetchType.EAGER标记@ * ToMany或使用Hibernate.initialize(..).异常的原因是默认情况下,在请求之前,不会从数据库中提取实体中的所有集合.但是当你从jax-ws序列化程序请求它们时,hibernate会话已经关闭.从技术上讲,你可以有一些OpenSessionInViewIntercepetor,但我不认为有一些可以随时使用的JAX-WS,写一个可能是个问题.如果您不想传输这些集合,可以使用@XmlTransient(或@JsonIgnore,根据序列化技术)对它们进行注释.它使实体有点混乱,但我仍然更喜欢它来编码重复. 我更喜欢第一个选项,因为它需要较少的biolerplate代码,但我同意在使用它时应该非常小心实体状态管理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |