【问题标题】:Getting Entity Key with Objectify 4使用 Objectify 4 获取实体密钥
【发布时间】:2012-10-01 14:33:48
【问题描述】:

我需要用这种实体做getKey()

@Entity
public class Value {
    @Id
    private long id;
    private byte[] value;

    com.googlecode.objectify.Key<Value> getKey() {
        return com.googlecode.objectify.Key.create(Value.class, id); // When executed this line throws NullPointerException
    }

        // Code omitted
}

但是,我之前在版本 3 中使用的模式似乎不再适用。 @Transient@Ignore 替换,但是当我用 @Ignore 注释我的 getKey() 函数时,我得到了这个错误:

The annotation `@Ignore` is disallowed for this location 

所以我只是把它注释掉了。看看它是否会起作用。

此外,

当我运行我的应用程序时,getKey() 函数会抛出 NullPointerException,如上所述。

那么,获取@Entity 密钥的模式是什么?

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    您不能创建具有 null 或 0 id 的密钥。 Objectify 和数据存储都不允许这样做。

    如果你想从一个实体创建一个 Key,首先要确保它有一个有效的 id。

    【讨论】:

    • 我正在尝试使用“子”实体键、值和版本来持久化 KeyValueVersion 实体...
    • 和我想的一样,Long 的@Id 是自动生成的?
    • 但是,实体“值”是一个“子”实体,“子”实体似乎不会自动生成 Id 字段,如果是,如何为子实体生成唯一 ID?
    • 对,在做getKey()之前先持久化Entity
    • 正确,Objectify 中没有级联保存操作。您需要明确保存子实体。您可以保存它们以设置 id,也可以通过调用 ObjectifyFactory.allocateId() 手动生成 id
    【解决方案2】:

    注解@Ignore 仅针对实体的字段,以声明这些字段不会存储在数据存储中。由于 getKey() 是一种方法,因此不应在其上使用 @Ignore 注释。

    有关@Ignore 注释的更多信息,请查看: http://objectify-appengine.googlecode.com/git/javadoc/index.html

    希望这会有所帮助!

    更新:

    对于 NPE,不确定是什么问题。你可以尝试用这个替换你的方法,看看它是否有效。

    com.googlecode.objectify.Key<Value> getKey() {
        return new com.googlecode.objectify.Key<Value>(Value.class, id); 
    }
    

    【讨论】:

    • 一个重要的附加知识是 Objectify 只保留字段,而不是 bean 属性。这就是@Ignore 不适用于方法的原因。
    • @stickfigure 好的,我明白了。但是,我仍然得到 NPE,我该如何处理?
    • @thanos 对了,反正getKey()方法为什么还在抛出NPE?
    • @thanos 您更新的答案中的代码将出现错误:'构造函数 Key(Class extends T>, long) is not visible' 我相信这种模式仅适用于 Objectify第 3 版
    • @thanos 我检查了“@Id Long Id”是否为空,但它不为空,并且 Key.create 是抛出 NPE 的那个......看起来它可以'无法正确生成密钥,可能是什么原因?
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多