2010-11-12 28 views
1

在App Engine的JDO实现中,对象类型与持久化到数据存储的实体一起保存为'Kind'。当这些实体从数据存储中取回时,它们将作为原始对象类型自动返回(在某个JDO层中)。令我困惑的是,只有班级的简单名字才会被保存;不是完整的路径。那么JVM如何加载正确的类?GAE/JDO如何将实体转换为域对象?

例如,如果我有com.project.domain.User,并且将此类的一个实例保存到数据存储中,则只会为实体类型定义“用户”。当我使用JDO来选择这个数据时,我得到一个com.project.domain.User。 GAE/JDO如何知道加载com.project.domain.User而不是com.project.other.domain.User?

回答

2

您的JDO提供者(GAE实际上并未涉及此等式)保留了实体到表的内部映射。有时它会从各种xml文件中形成,有时它通过注释形成它(取决于您的编码风格)。在这个映射表中,表名实际上映射到完全限定的类。

如果你存储两种类型的User对象,那么JDO会给你一个异常,因为他们会使用同一个表。你可以通过指定一个不同的表格(通过注释或XML配置)来解决这个问题。这个规范将进入JDO的内部映射。然后JDO会知道如何正确解析实体。

+0

那么这个内部映射如何在JVM启动/关闭之间持久?我还没有定义任何XML或注释。 – Brad 2010-11-12 05:00:48

+1

因为“JDO提供者”是GAE(或者更确切地说是他们的DataNucleus插件),所以GAE参与其中。如果您想解决这个问题,可以通过http://code.google.com/p/datanucleus-appengine/source/browse/trunk/src/org/datanucleus/store/appengine/DatastorePersistenceHandler.java – DataNucleus 2010-11-12 08:20:22