关系的GWT Resolver属性无法解析

时间:2012-07-26 14:04:17

标签: gwt jpa-2.0 requestfactory resolver

我正在使用JPA进行持久性的GXT项目,但我面临着双向关系持久性的问题。

我有这两个实体:

    @Entity
    @Table(name = "ACTV_REQ", catalog = "erpdb")
    @AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, columnDefinition = "BIGINT UNSIGNED"))
    @NamedQueries(value = { 
            @NamedQuery(name = "findByPerson", query="select object(m) from ActvReq m where m.people= :people")
    })
    public class ActvReq extends BaseEntity {
        @ManyToOne
        @JoinColumn(name = "PPL_ID")
        @NotNull
        private People people;

        @ManyToOne
        @JoinColumn(name = "ACTV_TYP_ID")
        private ActivityTyp actvTyp;

        @ManyToOne
        @JoinColumn(name= "PPL_ACTV_RIGHT_ID")
        private PeopleActvRight pplActvRight;

        @Column(name = "DESCR")
        private String desc;
    }

并且:

    @Entity
    @Table(name = "PPL_ACTV_RIGHT", catalog = "erpdb")
    @AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, columnDefinition = "BIGINT UNSIGNED"))
    @PeopleActvRightBeanConstraint
    @NamedQueries(value = { 
            @NamedQuery(name = "findByPeople", query="select object(m) from PeopleActvRight m where m.people= :people")
    })
    public class PeopleActvRight extends BaseEntity {

        @ManyToOne
        @JoinColumn(name="ACTV_TYP_ID")
        @NotNull    
        ActivityTyp type;

        @ManyToOne
        @JoinColumn(name="PPL_ID")
        @NotNull    
        People people;

        @ManyToOne
        @JoinColumn(name="ACTV_RIGHT_ID")
        ActvRight actvRight;

        @OneToMany(mappedBy="pplActvRight",cascade=CascadeType.ALL)
        private List<ActvReq> actvRequests = new ArrayList<ActvReq>();
    }

(我没有复制getter和setter,但存在方法。)

对于ActvReqProxy的持久性,它基本上是在我的EditorPresenter中完成的:

    getRequestContext().persistAndReturn(getModel()).with("actvTyp","people","pplActvRight").fire(new Receiver<M>() {
        @Override
        public void onSuccess(M response) {
        unsetContext();
        onSaveSuccess( response );
        }       
    });

响应pplActvRight在我得到的响应中已经为空,但是在getModel()中设置了pplActvReqProxy。

在服务器端,我有一个服务,它调用我的DAO的以下方法:

    public ActvReq persistAndReturn(ActvReq entity){
        em.getTransaction().begin();
        em.persist(entity);
        em.close;
        return entity;
    }

当我试图从我的编辑器中继续使用ActvReqProxy时,使用方法(“pplActvRight”,“people”,actvType“),我没有得到任何错误,但在我的数据库中,实体并不完全持久化。我的意思是在数据库中创建了一个新的ActvReq但是字段PPL_ACTV_RIGHT_ID保持为空。(它适用于人和actvTyp)

编辑:实际上我假设问题位于resolveDomainValue中的GWT Resolver上,它无法解析属性pplActvRight。好像我的EntityProxy对象在服务器端不存在。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以在服务器端persistAndReturn的开头,它已经null了?如果是这样,那么至少我们知道它与JPA无关。

您确定在客户端,在调用null之前,它在代理上设置为persistAndReturn以外的其他内容?您可以轻松验证它:使用Eclipse调试器可以查看将序列化代理的JSON代码(在调试器中选择代理对象时可以看到的代理字段之一)。请确保pplActvRight密钥的值不为空。

如果是这样,也许您应该调试将代理转换为服务器端实体的GWT源代码,以检查对pplActvRight属性执行的操作(为什么不将其分配给相应的ActvReq服务器边实例)。我不记得做这个东西的班级名字是什么,但是如果你找不到它我可以为你搜索。