Ref <! - ? - >值尚未初始化

时间:2012-10-12 02:19:37

标签: java google-app-engine objectify

我收到了这个错误:

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

}
  • createXxxKeyValue的静态Version方法只是创建这些类的新实例
  • put()方法将实体保存到数据存储中,然后将这些实体传递到KeyValueVersion,然后保存到数据存储中

1 个答案:

答案 0 :(得分:3)

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

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