【问题标题】:GWT RequestFactory not persisting attached entitiesGWT RequestFactory 不持久化附加实体
【发布时间】:2011-02-11 19:59:24
【问题描述】:

我正在尝试掌握新的RequestFactory API 并度过了一段非常艰难的时光。

我的域模型由StafferPersonOffice 组成。 Staffer 有一个 Person 和一个 Office 作为字段。

当我尝试将更新保存到 GWT 中的 Staffer 实例时,在服务器端 persist() 调用中,我在其原始/字符串字段中看到了更新,但我没有看到附加的 Person 或 @ 的更新987654327@ 对象。以下是我如何影响 GWT 方面的编辑:

private void persistStafferDetails()
{
    CRMRequestFactory.StafferRequest stafferRequest = requestFactory.stafferRequest();
    staffer = stafferRequest.edit(staffer);

    PersonProxy person = staffer.getPerson();
    person.setFirstName(firstNameField.getText());
    person.setLastName(lastNameField.getText());

    staffer.setPersonalEmail(personalEmailField.getText());
    staffer.getHomeLocation().setStreetAddress(addressField1.getText());
    staffer.getHomeLocation().setCity(cityField.getText());
    staffer.getHomeLocation().setPostalCode(postalField.getText());
    staffer.getHomeLocation().setProvince(provinceDropDown.getValue(provinceDropDown.getSelectedIndex()));

    stafferRequest.persist().using(staffer).fire();
}

这里是代理:

@ProxyFor(Staffer.class)
public interface StafferProxy extends EntityProxy
{
    Long getId();

    PersonProxy getPerson();
    void setPerson(PersonProxy person);

    OfficeProxy getOffice();
    void setOffice(OfficeProxy office);

    String getHomePhone();
    void setHomePhone(String homePhone);

    String getCellPhone();
    void setCellPhone(String cellPhone);

    String getPersonalEmail();
    void setPersonalEmail(String personalEmail);

    LocationProxy getHomeLocation();
    void setHomeLocation(LocationProxy homeLocation);
}

@ProxyFor(Person.class)
public interface PersonProxy extends EntityProxy
{
    Long getId();
    void setId(Long id);

    String getFirstName();
    void setFirstName(String firstName);

    String getLastName();
    void setLastName(String lastName);
}


@ProxyFor(Office.class)
public interface OfficeProxy extends EntityProxy
{
    Long getId();

    String getName();
    void setName(String name);
}

我的 CRMRequestFactory 看起来像:

public interface CRMRequestFactory extends RequestFactory
{
  @Service(Staffer.class)
    public interface StafferRequest extends RequestContext
    {
        InstanceRequest<StafferProxy, Void> persist();
        Request<List<StafferProxy>> getAll();
        Request<StafferProxy> findStaffer(Long id);
    }
    public StafferRequest stafferRequest();

    @Service(Person.class)
    public interface PersonRequest extends RequestContext
    {
        InstanceRequest<PersonProxy, Void> persist();
        Request<List<PersonProxy>> getAll();
        Request<PersonProxy> findPerson(Long id);
    }
    public PersonRequest personRequest();

    @Service(Office.class)
    public interface OfficeRequest extends RequestContext
    {
        InstanceRequest<OfficeProxy, Void> persist();
        Request<List<OfficeProxy>> getAll();
        Request<OfficeProxy> findOffice(Long id);
    }
    public OfficeRequest officeRequest();

}

【问题讨论】:

    标签: java gwt requestfactory


    【解决方案1】:

    RequestFactory 不会将 persist() 方法视为任何特殊的方法,因此您必须自己实现链式持久化或配置您的 ORM 系统来为您完成它。要检查的另一件事是,如果多次调用 findPerson()findOffice() 方法,则返回 Person 或 Office 对象的相同对象实例。如果您在传入 HTTP 请求的整个生命周期中使用相同的 EntityManager(或您系统的等效项),通常可以解决非平凡有效负载图的“丢失更新”问题。

    关于链式持久性的blog post 和带有简短讨论的问题tracker link

    如果这没有帮助,您能否发布您的域对象的 findFoo()persist() 方法的示例?

    【讨论】:

    • @BobV- 我的意思是,当我的 persist() 被调用时,从 GWT 端传入的对象对其原始字段进行了更新,但对嵌入的 Person 或 Office 的字段没有更新对象。换句话说,我的持久层甚至没有机会看到更新的字段。我将检查 EntityManager-per-request 是否可能是问题所在。谢谢!
    • 确实,使用相同的 EntityManager 解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2011-06-30
    • 2014-11-27
    相关资源
    最近更新 更多