JPA实体未正确地从EJB传递到Presentation Tier

时间:2016-03-20 09:43:18

标签: java jpa java-ee glassfish ejb-3.0

我正在尝试将一组JPA实体从业务层传递到表示层。全部部署在同一个应用服务器(Glassfish 4)上。客户端部署为.war文件,而Business Tier作为.ear,ejb可通过Remote接口访问。

为此,我有那些非常简单的方法,完全没有逻辑:

客户端

    public List<CompletedDesign> selectCompletedDesigns() {
        try {
            List<CompletedDesign> designs = customerFacade.selectCompletedDesigns();
            return designs;
        } catch (EJBException e) {
            e.printStackTrace();
        }
        return null;
    }

在ejb中

// EJB
@Override
@RolesAllowed("customer")
public List<CompletedDesign> selectCompletedDesigns() {

    final Principal callerPrincipal = sessionCtx.getCallerPrincipal();

    String name = callerPrincipal.getName();
    Customer customer = dataXchangeBean.getCustomerByID(name);
    List<CompletedDesign> cds = customerBean.selectCompletedDesigns(customer);
    return cds;
}

最后这是JPA实体的片段。

@Entity
@Table(name = "COMPLETED_DESIGN")
@NamedQueries({......})
public class CompletedDesign implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "ID")
    private String id;
    @Column(name = "DESCRIPTION")
    private String description;
    @Column(name = "NAME")
    private String name;
    @Column(name = "STATUS")
    private DesignStatus status;    
    @JoinColumn(name = "CUSTOMER_FK", referencedColumnName = "ID")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Customer customerFk;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "designFk", fetch = FetchType.LAZY)
    private List<Product> products;

通过设置断点,我可以看到在EJB端正确检索了cds列表。第一个问题是,为什么我得到一个Vector而不是List?我正在使用JPS方面的TypedQuery,它应该正确地转换对象。

enter image description here

但是我主要担心的是:在表示层中客户端类本身的后续断点中,似乎无法完全重构对象,值都为null,并且缺少类型。我在这里缺少什么?

enter image description here

2 个答案:

答案 0 :(得分:0)

您正在使用LAZY加载,这意味着在您访问它们时将加载相关对象,而不是在加载主对象时加载(如果您确实不需要它们,则不会加载它们)。但是,当主对象与会话分离时,这不起作用。因此,您必须使用EAGER而不是延迟,或者只是在通过远程接口传递之前加载(访问)事务中所需的集合。

答案 1 :(得分:0)

在花了好几天试图让它工作之后,我发现这个SO帖子,它带来了最明显的解决方案,Glassfish和EclipseLink的错误!!!

SO帖子: EclipseLink deserializes an empty entity object on remote EJB call

错误: eclipselink.weaving breaks marshalling out of the box