加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 我可以在JAXWS Web服务方法中返回Hibernate Entities作

发布时间:2020-12-15 08:39:41 所属栏目:Java 来源:网络整理
导读:任何人都可以告诉我,我可以将Hibernate实体作为JAXWS Web服务方法中的返回值返回! 的确,我有一些这样的实体: @Entitypublic class Parent {... private Childone childoneByChildoneid; @ManyToOne public @javax.persistence.JoinColumn(name="ChildOneId
任何人都可以告诉我,我可以将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,根据序列化技术)对它们进行注释.它使实体有点混乱,但我仍然更喜欢它来编码重复.
>使用DTO(数据传输对象) – 将所有数据从实体传输到具有类似结构的新对象,该对象将由Web服务公开.再次,您必须确保在休眠会话处于活动状态时填充DTO

我更喜欢第一个选项,因为它需要较少的biolerplate代码,但我同意在使用它时应该非常小心实体状态管理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读