Java JPA实体未正确地从EJB传递到表示层

Java JPA实体未正确地从EJB传递到表示层,java,jpa,jakarta-ee,glassfish,ejb-3.0,Java,Jpa,Jakarta Ee,Glassfish,Ejb 3.0,我试图将一组JPA实体从业务层传递到表示层。所有这些都部署在同一个应用服务器上(Glassfish 4)。客户端作为.war文件部署,而业务层作为.ear部署,ejb可通过远程接口访问 为此,我有一些非常简单的方法,完全没有逻辑: 客户 public List<CompletedDesign> selectCompletedDesigns() { try { List<CompletedDesign> designs = c

我试图将一组JPA实体从业务层传递到表示层。所有这些都部署在同一个应用服务器上(Glassfish 4)。客户端作为.war文件部署,而业务层作为.ear部署,ejb可通过远程接口访问

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

客户

    public List<CompletedDesign> selectCompletedDesigns() {
        try {
            List<CompletedDesign> designs = customerFacade.selectCompletedDesigns();
            return designs;
        } catch (EJBException e) {
            e.printStackTrace();
        }
        return null;
    }
public List selectCompletedDesigns(){
试一试{
列表设计=customerFacade.selectCompletedDesigns();
退货设计;
}捕获(EJBException e){
e、 printStackTrace();
}
返回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;
}
//EJB
@凌驾
@允许的角色(“客户”)
公共列表selectCompletedDesigns(){
最终主体callerPrincipal=sessionCx.getCallerPrincipal();
字符串名称=callerPrincipal.getName();
Customer=dataXchangeBean.getcustomerbyd(名称);
列表CD=客户bean。选择CompletedDesign(客户);
归还光盘;
}
最后,这是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;
@实体
@表(name=“已完成的设计”)
@namedquerys({……})
公共类CompletedDesign实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=20)
@列(name=“ID”)
私有字符串id;
@列(name=“DESCRIPTION”)
私有字符串描述;
@列(name=“name”)
私有字符串名称;
@列(name=“STATUS”)
私人设计地位;
@JoinColumn(name=“CUSTOMER\u FK”,referencedColumnName=“ID”)
@ManyToOne(可选=false,fetch=FetchType.LAZY)
私人客户;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“designFk”,fetch=FetchType.LAZY)
私人上市产品;
通过设置断点,我可以看到在EJB端正确地检索到
cds
列表。第一个问题是,为什么我得到的是向量而不是列表?我使用的是来自JPS端的TypedQuery,它应该正确地强制转换对象

然而,我主要关心的是:在表示层中客户端类本身的后续断点中,它似乎无法完全重建对象,值都为null,类型丢失。我在这里缺少什么


您正在使用延迟加载,这意味着相关对象将在您访问它们时加载,而不是在加载主对象时加载(因此,如果您确实不需要它们,则不会加载它们)。但是,当主对象从会话中分离时,这不起作用。因此,您必须使用“渴望”而不是“懒惰”,或者仅使用“加载(访问)”在通过远程界面之前,事务中需要的集合。

经过几天的努力,我发现了这篇文章,它带来了最明显的解决方案,Glassfish和EclipseLink的一个bug

SO职位:

错误:

uhm…问题不在相关实体上,而在id、name等字段上。这些字段只是CompletedDesigns的属性。我不想问一个愚蠢的问题,但当您尝试访问实体时是否会出错,或者这是一个IDE问题?实际上,我是从JSF页面访问对象,并使用
{completedDesign.description}
我也没有在视频中看到任何东西。控制台中没有任何错误。您显示的代码必须来自支持页面的
ManagedBean
,因为它是一种方法。我不理解CustomerFacade EJB上的
@Override
注释。它不应该是
@Stateless
?是的,它是无状态的,但可以通过tro访问ugh是一个@Remote接口。IDE已经自动添加了覆盖。是的,我能说的最好的一点是,由于某种原因,没有从数据库中提取实体。这里没有足够的信息来进一步猜测。