【问题标题】:GWT Resolver attribute of relationship can not be resolved无法解析关系的 GWT Resolver 属性
【发布时间】:2012-07-27 17:58:42
【问题描述】:

我正在使用 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;
    }

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

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

有什么想法吗?

【问题讨论】:

  • 您确定 pplActvRight 属性在您坚持 ActvReqProxy 的那一刻设置在 ActvReqProxy 上吗?您还可以显示持续存在的代码ActvReqProxy吗?
  • 好吧,只要我们在客户端,一切似乎都是正确的。但是一旦在服务器端 pplActvRight 为空。

标签: gwt jpa-2.0 requestfactory resolver


【解决方案1】:

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

您确定在客户端调用persistAndReturn 之前,它在代理上设置为null 以外的其他值?您可以轻松地对其进行验证:使用 Eclipse 调试器可以查看将序列化到哪个代理的 JSON 代码(在调试器中选择代理对象时可以看到的代理字段之一)。请确保pplActvRight 键存在且具有非空值。

如果是这样,也许您应该调试将代理转换为服务器端实体的 GWT 源代码,以检查该 pplActvRight 属性正在做什么(为什么它没有分配给相应的 ActvReq 服务器端实例)。我不记得做这些东西的类名是什么,但如果你找不到它,我可以搜索它。

【讨论】:

  • 首先,我确定在服务器上调用我的服务之前 pplActvRightProxy 不为空,并且填充了正确的值。但是,关于客户端 EntityProxy 和服务器端实体之间的绑定,如果按照我的想法,通过方法 resolveDomainValue 中的类“package com.google.web.bindery.requestfactory.server.Resolver”完成,我注意到它无法解析 pplActvRight '因为 pplActvRight 的对象域为空(但它适用于人和 actvTyp)。
  • 您是否认为我的问题可能与 ActvReq 无关,而仅与 PplActvReq 有关,因为它是唯一无法解决的属性?因为我对 pplActvReq 和 ActvTyp 和 People 的关系做了完全相同的事情。也许我在坚持它时犯了一个错误,因为我在 pplActvRight 遇到了另一个问题。我可以删除 pplActvRight 或创建一个,但是当我尝试编辑它时,我得到了同样的错误,它无法解决它并且我得到错误:请求的实体在服务器上不可用。你认为它有联系吗?
  • 错误:“请求的实体在服务器上不可用”似乎表明它与代理的 id/stableId 有关。 RF 尝试通过使用 id 查找实体服务器端来定位它们。您能否为 PplActvReq 显示您的 Locator 对象的代码?或 findPplActvReq 方法(我不知道您使用哪种机制)。这可能真的很重要。
  • 关于 ActvReq 或 PeopleActvRight 的定位器,很难给你一个示例代码,因为它是通用的,但它似乎在其他任何地方都可以正常工作。那么我认为这不是引发问题的原因。关于方法查找。我在我的 DAO 中有一个方法 findById(Long id){return em().find(persistentClass, id);}
  • 请开始一个接一个地删除 PeopleActvRight 的属性,直到它开始正确地持续/更新。我认为 PeopleActvRight 属性之一有可能对问题负责。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多