首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDO + RequestFactory -实体版本控制

JDO + RequestFactory -实体版本控制
EN

Stack Overflow用户
提问于 2012-08-11 21:16:49
回答 2查看 591关注 0票数 0

我试图设置一个非常简单的RequestFactory示例,但我失败了。我将实体持久化到我的数据存储中,但是当我再次尝试取出它们时,我得到了一个

代码语言:javascript
复制
com.google.web.bindery.requestfactory.server.UnexpectedException: The persisted entity with id aglub19hcHBfaWRyCgsSBFVzZXIYBAw has a null version

首先,这是我的带JPO注释的实体类。最后,你会发现RequestFactory要调用的静态函数,以及一个将成为InstanceRequest的非静态成员函数。

代码语言:javascript
复制
package com.test.server;

import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.annotations.Column;
import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.annotations.Version;
import javax.jdo.annotations.VersionStrategy;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
@Version(strategy = VersionStrategy.VERSION_NUMBER, column = "VERSION", extensions = {         @Extension(vendorName = "datanucleus", key = "field-name", value = "version") })
public class User {

public User() {

}

public User(String name) {
    this.name = name;
}

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;

@Persistent
@Column(name = "version")
private Integer version;      

@Persistent
private String name;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public Integer getVersion() {
    return version;
}

public void setVersion(Integer version) {
    this.version = version;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

  public static final PersistenceManager persistenceManager() {
        return PMF.get().getPersistenceManager();
      }

  @SuppressWarnings("unchecked")
  public static List<User> findAllUsers() {
      PersistenceManager pm = persistenceManager();
      try {
          String query = "SELECT FROM " + User.class.getName();
          List<User> objects = (List<User>) pm.newQuery(query).execute();
          objects.size(); // This is the workaround to retrieve all objects
          return objects;
      } finally {
          pm.close();
      }
  }

  public static User findUser(String id) {
      PersistenceManager pm = persistenceManager();
      try {
            User u = pm.getObjectById(User.class, id);
            return u;
      } finally {
          pm.close();
      }
  }

  public void persist() {
        PersistenceManager pm = persistenceManager();
        try {
          pm.makePersistent(this);
        } finally {
          pm.close();
        }
      }
  }

RequestFactory接口本身非常简单

代码语言:javascript
复制
 package com.test.shared;

 import com.google.web.bindery.requestfactory.shared.RequestFactory;

 public interface UserOrderRequestFactory extends RequestFactory {
UserRequest userRequest();
 }

相应的RequestContext也是如此

代码语言:javascript
复制
package com.test.shared;

import java.util.List;

import com.google.web.bindery.requestfactory.shared.InstanceRequest;
import com.google.web.bindery.requestfactory.shared.RequestContext;
import com.google.web.bindery.requestfactory.shared.Service;
import com.google.web.bindery.requestfactory.shared.Request;
import com.test.server.User;

@Service(User.class)
public interface UserRequest extends RequestContext {
    Request<List<UserProxy>> findAllUsers();
    InstanceRequest<UserProxy, Void> persist();
}

下面是客户端的用户代理

代码语言:javascript
复制
package com.test.shared;

import com.google.web.bindery.requestfactory.shared.EntityProxy;
import com.google.web.bindery.requestfactory.shared.EntityProxyId;
import com.google.web.bindery.requestfactory.shared.ProxyFor;

@ProxyFor(com.test.server.User.class)
public interface UserProxy extends EntityProxy {
    EntityProxyId<UserProxy> stableId();
    String getName();
    void setName(String name);
}

最后是我的onModuleLoad(),它首先持久化一个用户,然后获取所有用户的列表。

代码语言:javascript
复制
public void onModuleLoad() {

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

    UserRequest userRequest = requestFactory.userRequest();

    UserProxy user = userRequest.create(UserProxy.class);
    user.setName("Luigi");

    userRequest.persist().using(user).fire( new Receiver<Void>()
            {
              @Override
                public void onSuccess(Void arg0)
                {
                    GWT.log("User persisted.");
                }
            });


    userRequest = requestFactory.userRequest();
    Request<List<UserProxy>> findAllUsersRequest = userRequest.findAllUsers();
    findAllUsersRequest.fire( new Receiver<List<UserProxy>>() {
        @Override
        public void onSuccess(List<UserProxy> list) {
            for(UserProxy u: list) {
                GWT.log(u.getName());
            }
        }
    });

欢迎任何意见。我将很高兴收到任何关于这方面的建议。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-12 00:06:51

虽然JPA似乎会自动执行此操作,但推进JDO中的版本计数器似乎是我的工作。我将以下代码添加到User.java中的persist例程中

代码语言:javascript
复制
// JPA @Version does this automatically, but JDO @Version is not working like that. Not sure why.
if (version == null) {
 version = 0l;
}
version++;
票数 0
EN

Stack Overflow用户

发布于 2013-11-23 14:32:39

我不确定这是否重要,但@Version column = "VERSION“与@Column(name = "version")不匹配。

然而,GAE并没有真正的‘column’,您可以通过删除Column= "“和@Column来忽略它们。

请参阅http://gae-java-persistence.blogspot.com.au/2009/10/optimistic-locking-with-version.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11915035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档