Java 我可以在JAXWS web服务方法中返回Hibernate实体作为返回值吗?
有人能告诉我,我可以在JAXWS web服务方法中将Hibernate实体作为返回值返回吗 事实上,我有一些类似的实体:Java 我可以在JAXWS web服务方法中返回Hibernate实体作为返回值吗?,java,web-services,hibernate,jpa,jax-ws,Java,Web Services,Hibernate,Jpa,Jax Ws,有人能告诉我,我可以在JAXWS web服务方法中将Hibernate实体作为返回值返回吗 事实上,我有一些类似的实体: @Entity public class Parent { ... private Childone childoneByChildoneid; @ManyToOne public @javax.persistence.JoinColumn(name="ChildOneId",referencedColumnName="Id")
@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;
}
...
}
当我从客户端调用此web方法时,我得到LazyInitializationException异常:(
我测试了可序列化和可克隆的接口,并覆盖了克隆方法,但不幸的是,它不起作用,我在manager中使用em.detach(parent),但它仍然不起作用
有人能帮我吗
tnax这是有争议的。通常,您有两种选择:
- 返回实体,但确保它们已初始化。使用
标记fetch=FetchType.EAGER
,或使用@*ToMany
。出现异常的原因是,默认情况下,实体中的所有集合在被请求之前都不会从数据库中获取。但是当您从jax ws序列化程序请求它们时,hibernate会话已经关闭。从技术上讲,您可以使用一些Hibernate.initialize(…)
,但我认为还没有准备好-与JAX-WS一起使用,编写一个可能会有问题。如果您不想传输这些集合,可以使用OpenSessionInviewinterceptor
(或@xmltransive
,取决于序列化技术)对它们进行注释。这会使实体有点混乱,但我仍然喜欢它而不是代码复制@JsonIgnore
- 使用DTO(数据传输对象)-将所有数据从实体传输到具有类似结构的新对象,该对象将由web服务公开。同样,您必须确保在hibernate会话处于活动状态时填充DTO
@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;
}
}