1

次のエラーが表示されます。

java.lang.IllegalStateException: Ref<?> value has not been initialized
    at com.googlecode.objectify.impl.ref.StdRef.get(StdRef.java:55)
    at com.mycomp.simplify.KeyValueVersion.getVersion(KeyValueVersion.java:59)

このエンティティを永続化しようとすると:

public class KeyValueVersion {


        @Id
        private Long id;
        private Ref<Key> key;
        private Ref<Value> value;
        private Ref<Version> version;

        public KeyValueVersion() {

        }

        public KeyValueVersion(Key key, Value value, Version version) {
            setKey(key);
            setValue(value);
            setVersion(version);
        }

        public Key getKey() {
            return this.key.get();
        }
        public void setKey(Key key) {
            this.key = Ref.create(key.getKey(), key);
        }
        public Value getValue() {
            return this.value.get();
        }
        public void setValue(Value value) {
            this.value = Ref.create(value.getKey(), value); 
        }
        public Version getVersion() {
            return this.version.get();
        }
        public void setVersion(Version version) {
            this.version = Ref.create(version.getKey(), version); 
        }

        public Long getId() {
            return id;
        }

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

これは私がエンティティを永続化する方法です:

public Version put(final Key key, final Value value) throws KeyException {
    final ExceptionWrapper ew = new ExceptionWrapper();
    Version v = ofy().transact(new Work<Version>() {
        @Override
        public Version run() {
            Version v = null;
            try {
                Version version = new Version(new Date().getTime());
                ofy().save().entity(key).now();
                ofy().save().entity(value).now();
                ofy().save().entity(version).now();
                com.googlecode.objectify.Key<KeyValueVersion> result = 
                        ofy().save().entity(new KeyValueVersion(key, value, version)).now();
                v = get(result).getVersion();
            } catch (EntityNotFoundException e) {
                ew.exception = new KeyPersistenceFailureException(key);
            } 
            return v;
        }
    }); 
    if(ew.exception != null) throw ew.exception;
    return v;
}

これは、これらのコードを実行するメイン テストです。

@Test
public void testCreateFetch() throws KeyException { 
    Value val = Value.createValue("John".getBytes());
    Key key = Key.createKey("uid:john:fname");
    Version ver = sfy.put(key, val); 

}
  • の静的createXxxメソッドはKey、これらのクラスの新しい新しいインスタンスを作成するだけValueですVersion
  • このput()メソッドは、エンティティが に渡される前にエンティティをデータストアに保存し、エンティティがデータストアにKeyValueVersion保存されます。
4

1 に答える 1

3

問題は、KeyValueVersion エンティティをフェッチしてから、Ref の値にアクセスしようとしていることです。Objectify はデフォルトでは参照をロードしないため、初期化されていない Ref にアクセスしようとしています。

あなたが何をしようとしているのかはっきりとはわかりませんが、Ref フィールドに @Load を追加すると、マスター エンティティをロードするときに Objectify がそれらをロードします。

于 2012-10-12T06:31:02.737 に答える