GAE-Java中JDO部分的KEY
发现有些部分的文档,看一次是绝对不可能看懂的。必须要过两天回头再来看,才发现一些端倪。比如这里要说的是JDO中类的KEY。
习惯了RDBMS开发的同志们,都会想到这还不是一个很简单的问题,无非就是选择一个唯一的可以代表该实例的作为ID就可以了。特别是目前开发中,大多数人喜欢用系统自动生成的ID序列来构造key。然而在GAE所支持的JDO中,我们会发现文档中提供了四种方式来实现KEY,不同的方法适用于不同的场合。
1. Long变量
这就是上面所说的最常见的一种,由系统自动生成的长整型变量来表示KEY。注意,这种选择只适用于那些没有父类的类。什么叫没有父类的类呢?例如有两个类,People和ContactInfo,在People类中,有一个属性就是ContantInfo,那么在这种情况下,People类就是有父类的类,而ContactInfo就是没有父类的类。
2.Unencoded String
和上面的Long变量一样,这个KEY的实现同样只适用于那些没有父类的类。但是在这里,它的值是由程序指定的,在这里使用的是没有编码的String类型。
3.Key
Key类是GAE-Java中专门提供的作为KEY的类型,它包含了可能有的父类信息以及一个系统自动分配或者程序指定的ID。也就是说,它是在包括父类信息的前提之下,选择以上两种选择之一来共同完成Key的任务。用KeyFactory的createKey()方法即可完成这一功能。
4.Key作为编码String
这种类型和Key类型是很相似的,只是将Key转化为来String来进行操作,方便使用。Key和encoded String之间可以用KeyFactory的keyToString()和stringToKey()方法互相转换。因为是String类型,所以如果想要得到ID的其中的内容,可以在声明了Key之后,附加声明其String或者Long类型的ID。@Extension(vendorName=”datanucleus”, key=”gae.pk-name或者gae.pk-id”,value=”true”)。同样,name类型的值是可以更改的,但是id类型的是自动生成无法变化的。
如何生成Key?
1. 对于没有父类的类型,我们可以使用createKey()静态方法来实现。它的参数包括createKey(String kind, String name)。其中kind就是指的要创造的类的类型,一般用Class.class.getSimpleName()来实现。第二个参数取决于使用的是自动生成的Long变量还是程序指定的String变量而定。
2,对于有父类的类型,我们同样可以使用createKey()的另一个重载方法来实现createKey(Key parent, String kind, long id)。在这里,我们首先实现父类的Key,然后将其包括在方法参数内即可。
不过在教程上,提供了另外一种方法来是实现,使用的是KeyFactory.Builder类。在这里首先通过构造函数,实现一个Key,然后不断调用addChild()方法,把子类附加上,最后通过getKey()方法得到Key。这种方法的好处在于可以产生一个链状的Builder,更加方便使用。比如在我们上面的People和ContactInfo例子之中,首先我们生成ContactInfo的Key,然后下一步附加上People的Key即可。
如何通过Key得到对象
一个很简单的方法,就是pm.getObjectById(class, key/id);如果你有的是key,第二个参数就用key;如果有的是id,第二个参数就用id。同时,你可以选择使用非类里面声明的类型,来作为第二个参数。比如在类里面使用的是Key,你可以通过调用name的String来获得。唯一的例外是String和Long之间的互相调用是不允许的。



