DataNucleus将现有的多个外键添加到Object

时间:2017-05-31 20:25:38

标签: java jdo datanucleus

使用JDO和DataNucleus如果我有@PersistenceCapable类,如

@PersistenceCapable
public class Topic  {

            @PrimaryKey
            @Unique
            @Persistent(valueStrategy = IdGeneratorStrategy.UUIDHEX)
            private String id;
    }

和另一个

@PersistenceCapable
public class Subscription  {

    @PrimaryKey
    @Unique
    @Persistent(valueStrategy = IdGeneratorStrategy.UUIDHEX)
    private String id;

    @Persistent
    @Join(column="SUBSCRIBE_ID_OID")
    @Element(column="TOPIC_ID_EID")
    private List<Topic> topics;

}

在我的客户端代码中,我下载了一个主题列表,每个主题都带有一个ID,并将这些主题添加到新订阅的列表中

JSON帖子正文可能如下所示:

{
    "topics": [{

        "id": "402881115c63f3da015c63f3daa40000",

    }, {

        "id": "402881115c63f3da015c63f3daca0001",

    }, {

        "id": "402881115c63f3da015c63f3dade0002",

    }]
}

我现在想要坚持我的新订阅:

 public void addEntity(Subscription s) {
        PersistenceManager pm = persistenceManagerFactory.getPersistenceManager();

        try{
            pm.makePersistent(s);

        } finally {
            pm.close();
        }
    }

我所期望的是,新订阅的Join表和现有主题中的1-N关系。当我得到三个新的主题,新的ID插入到主题表中与新记录的1-N关系。

对我而言,DN正在考虑我对新订阅的持续性并将列表视为新数据,我正在试图弄清楚如何正确地执行此操作,因此主题列表是原始ID。

1 个答案:

答案 0 :(得分:1)

您的JSON响应需要考虑对象是否实际存在于数据存储区中。因此,如果您遍历Topic个对象并调用pm.getObjectById来提供此检查,那么,如果返回了一个对象,那么您可以使用此附加Topic而不是最初的分离对象在Subscription列表中。

此后调用pm.makePersistent将找到附加的对象,并相应地设置连接表条目(使用FK到TOPIC表中的现有行),而不创建新的元素对象