GWT RequestFactory:未传播到级联对象的更新

时间:2013-02-06 12:19:13

标签: gwt jpa requestfactory

我有一个带有引用对象ItemVersion的实体公司,我使用JPA(eclipselink)作为持久层。这里给出了代码提取:

@Entity
public class Company{
    private String instance;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_item_version_id")
    private ItemVersion itemVersion;
}

@Entity
public class ItemVersion{
    private String comment;
...
}

我可以创建一个Company对象并保留它。我也可以找到新对象,更新属性“实例”并保持它,一切正常。 当我更改引用的ItemVersion对象的属性“comment”时,此更改不会存储在服务器端。

创建/更新测试代码如下所示:

final EventBus eventBus = new SimpleEventBus();
final AftdRequestFactory requestFactory = GWT.create(AftdRequestFactory.class);
requestFactory.initialize(eventBus);

final CompanyRequest request = requestFactory.companyRequest();
final CompanyProxy newCompany = request.create(CompanyProxy.class);
newCompany.setInstance("1");
ItemVersionProxy newVersion = request.create(ItemVersionProxy.class);
newVersion.setComment("first comment");
newCompany.setItemVersion(newVersion);

request.persist().using(newCompany).fire(new Receiver<Void>() {
    @Override
    public void onSuccess(Void arg0) {
    final CompanyRequest request2 = requestFactory.companyRequest();
    Request<CompanyProxy> p = request2.findCompany(1L).with("itemVersion");
    p.to(new Receiver<CompanyProxy>() {
        @Override
        public void onSuccess(CompanyProxy response) {
            final CompanyRequest request3 = requestFactory.companyRequest();
            final CompanyProxy editableCompany2 = request3.edit(response);
            editableCompany2.setInstance("2");
            editableCompany2.getItemVersion().setVersionNumber(2);
            request3.persist().using(editableCompany2).fire(new Receiver<Void>() {
                @Override
                public void onSuccess(Void arg0) {
                    // persist company version
                    System.out.println("company updated");

但是,“实例”和“注释”的更新通过线路(在客户端和服务器之间检查),但在公司的持久化方法中,引用的ItemVersion对象及其“注释”属性未更新而“实例”更新,因此存储旧的评论。

公司的持久方法如下:

public void persist() throws PersistenceException {
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = null;
    try {
        tx = em.getTransaction();
        tx.begin();
        Company existingEntity = findCompany(getId());
        if (existingEntity == null) {
            em.persist(this);
        } else {
            setId(existingEntity.getId());
            em.merge(this);
        }
        tx.commit();
    } catch (RuntimeException e) {
        tx.rollback();
        throw e;
}

使用搜索并根据搜索结果处理em.persist或em.merge是必要的,因为简单的持久性不会存储任何更新。

1 个答案:

答案 0 :(得分:0)

必须使用RequestFactory中的open-session-in-view / session-per-request模式(即在请求的生命周期内共享相同的EntityManager实例);有关详细信息,请参阅https://code.google.com/p/google-web-toolkit/issues/detail?id=7827

相关问题