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

DataNucleus add existing multiple foreign keys to Object

使用 JDO 和 DataNucleus 如果我有一个 @PersistenceCapable class 喜欢

@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,并将这些主题添加到新订阅的列表中

A JSON post body 可能看起来像这样:

{
    "topics": [{

        "id": "402881115c63f3da015c63f3daa40000",

    }, {

        "id": "402881115c63f3da015c63f3daca0001",

    }, {

        "id": "402881115c63f3da015c63f3dade0002",

    }]
}

我现在想这样坚持我的新订阅:

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

        try{
            pm.makePersistent(s);

        } finally {
            pm.close();
        }
    }

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

我认为 DN 正在接受我对新订阅的坚持并将列表视为新数据,这对我来说很有意义,我正在尝试弄清楚如何正确地执行此操作,以便主题列表是原始 ID。

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

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