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方法KeyValue并且Version只是创建这些类的新实例
  • put()方法将实体保存到数据存储中,然后将它们传递到KeyValueVersion然后保存到数据存储中
4

1 回答 1

3

问题是您正在获取 KeyValueVersion 实体,然后尝试访问 Ref 的值。Objectify 默认情况下不加载引用,因此您尝试访问未初始化的 Ref。

我不太清楚您要做什么,但是如果您在 Ref 字段上添加 @Load,Objectify 会在您加载主实体时为您加载它们。

于 2012-10-12T06:31:02.737 回答