【问题标题】:JDO doesn't create Owned Entities in Google App EngineJDO 不在 Google App Engine 中创建自有实体
【发布时间】:2011-06-01 06:26:09
【问题描述】:

大家好,我的问题是关于在 JDO 中持久化一个实体。我创建了一个类,StoredOPDSFeed,它的成员正确地持续存在。但是,它的任何成员对象都不能正确持久。类如下:

@PersistenceCapable
public class StorableOPDSFeed implements Serializable {

private static final long serialVersionUID = 1L;

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String primaryKey;

@Persistent
private String locale;

@Persistent
private Date parseDate;

@Persistent
private String title;

@Persistent
private String href;

@Persistent
@Element(dependent = "true")
private ArrayList<OPDSEntry> entries;

@Persistent
@Element(dependent = "true")
private ArrayList<OPDSLink> links = new ArrayList<OPDSLink>();

@Persistent
@Embedded
private SearchDescription searchDescription;

@Persistent
private boolean isStart = false;

@Persistent
@Element(dependent = "true")
private ArrayList<OPDSFacetGroup> facet_groups = new ArrayList<OPDSFacetGroup>();

... and accessors, etc.
}

所有简单的成员,如语言环境、标题、href 等都正确保留。但是,所有复杂的,例如 searchDescription 都不会出现在数据存储中。没有对它们的任何引用,没有外键,什么都没有。就好像他们被完全忽略了一样。有人知道为什么吗?

根据请求,这里是 OPDSLink 的代码:

@PersistenceCapable
public class OPDSLink implements Serializable { 
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey;

private static final long serialVersionUID = 1L;

@Persistent
private String href;

@Persistent
private String rel;

@Persistent
private String type;

@Persistent
private String price;

@Persistent
private String currency;

@Persistent
private String dcformat;

@Persistent
private String title;
... and accessors, etc.
}

【问题讨论】:

    标签: google-app-engine google-cloud-datastore jdo


    【解决方案1】:

    GAE JDO 文档指出,在一对一关系中,两个相关实体都需要一个关键字段。 http://code.google.com/appengine/docs/java/datastore/jdo/relationships.html#Owned_One_to_One_Relationships

    如果其他实体按照您的示例中的预期嵌入,则其他类(例如 SearchDescription)需要 @EmbeddedOnly 注释: http://code.google.com/appengine/docs/java/datastore/jdo/dataclasses.html#Embedded_Classes

    总的来说,我发现以下博客采访是一个很好的起点,可以了解 GAE JDO 实现支持什么以及不支持什么(尤其是与 Objectify 和 Twig 等第三方框架相比): http://borglin.net/gwt-project/?page_id=604

    【讨论】:

    • 虽然我很欣赏这个链接,但不幸的是,该评论根本不适用。我所指的大多数成员都是拥有的一对多关系,正如您所看到的,类中的拥有的一对一关系已经设置为 Embedded。然而,这确实导致了拥有的一对一关系出现,所以这个答案至少解释了这种行为,所以我很感激。然而,主要问题尚未得到解答。
    • 您能给我们看看 OPDSLink 和 OPDSFacetGroup 类的代码吗?您是否也尝试过删除 @Element(dependent = "true")?
    • 绝对 - 我添加了 OPDSLink 定义,因为它是两个类中更简单的一个。我的原始代码不包含 @Element(dependent = "true") 并且它不起作用。我添加了 "@Element(dependent = "true")" 以查看它是否会有所作为(因为在这种情况下,OPDSLink 确实是依赖的)。谢谢你的时间!
    • 我尝试仅针对 StorableOPDSFeed 和 OPDSLink 复制您的示例,而不实现 Serializable。它抱怨 StorableOPDSFeed 中的 primaryKey 是 String 类型。将其更改为 com.google.appengine.api.datastore.Key 后,它对我有用。我将您的示例剥离到基本字段/类,因此您的代码中可能有其他内容阻止它工作。尝试从文档中给出的示例开始,并将其扩展到您的需要。
    • 非常有趣。同时,我使用 Twig 从您的第一个链接重写了所有内容,并且一切都开始工作了。比 JDO 更快更容易,所以我将其标记为接受只是为了让我开始使用 Twig,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2011-10-22
    • 2010-12-11
    • 2011-12-28
    • 2011-06-19
    相关资源
    最近更新 更多