0

非常に簡単なRequestFactoryの例を設定しようとしましたが、失敗しました。私はエンティティをデータストアに永続化して見つけましたが、それらを再度引き出しようとすると、

com.google.web.bindery.requestfactory.server.UnexpectedException: The persisted entity with id aglub19hcHBfaWRyCgsSBFVzZXIYBAw has a null version

まず、これは私のJPO注釈付きエンティティクラスです。最後に、RequestFactoryが呼び出す静的関数と、InstanceRequestになる非静的メンバー関数が見つかります。

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インターフェース自体は本当にシンプルです

 package com.test.shared;

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

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

対応するRequestContextも同様です

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();
}

これがクライアント側のユーザーのプロキシです

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()。

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());
            }
        }
    });

どんな入力でも大歓迎です。これについてアドバイスをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

0

JPAはこれを自動的に行うようですが、JDOのバージョンカウンターを進めるのが私の仕事のようです。User.javaのpersistルーチンに次のコードを追加しました

// JPA @Version does this automatically, but JDO @Version is not working like that. Not sure why.
if (version == null) {
 version = 0l;
}
version++;
于 2012-08-11T16:06:50.793 に答える
0

重要かどうかはわかりませんが、@ Version column = "VERSION"が@Column(name = "version")と一致しません。

ただし、GAEには実際には「列」自体がないため、column=""と@Columnを削除することで無視できます。

http://gae-java-persistence.blogspot.com.au/2009/10/optimistic-locking-with-version.htmlを参照してください

于 2013-11-23T06:32:39.487 に答える