【问题标题】:JDO Delete parent row without deleting the children rowsJDO 删除父行而不删除子行
【发布时间】:2020-03-16 09:11:07
【问题描述】:

我需要一些帮助来尝试从父表中删除一行但不删除子表。我有这张表 MyEntityA。这有 2 个表 MyEntityB 的外键,例如:

@PersistenceCapable(detachable = "true")
public class MyEntityA implements Serializable {

    private static final long serialVersionUID = 3575973891490133579L;

    /*
     * KEYS
     */
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.UUIDHEX)
    @Column(name = “Id", jdbcType = "VARCHAR", length = 32)
    private String Id;

    @Persistent(defaultFetchGroup = "true", dependent = "true")
    @Column(name = "CURRENTCLIENT", jdbcType = "VARCHAR", length = 32)
    @ForeignKey(name = “MY_ENTITY_B_FK1", deleteAction = ForeignKeyAction.RESTRICT, table = “MY_ENTITY_B", columns = {
            @Column(name = “ID") }, updateAction = ForeignKeyAction.RESTRICT)
    private MyEntityB currentClient;

    @Persistent(defaultFetchGroup = "true", dependent = "true")
    @Column(name = "RELATEDTO", jdbcType = "VARCHAR", length = 32)
    @ForeignKey(name = “MY_ENTYTY_B_FK2", deleteAction = ForeignKeyAction.RESTRICT, table = "MY_ENTITY_B", columns = {
            @Column(name = “ID") }, updateAction = ForeignKeyAction.RESTRICT)
    private MyEntityB relatedTo;


    public Relationship() {
    }


    public MyEntityB getCurrentClient() {
        return currentClient;
    }

    public void setCurrentClient(MyEntityB currentClient) {
        this.currentClient = currentClient;
    }

    public MyEntityB getRelatedTo() {
        return relatedTo;
    }

    public void setRelatedTo(MyEntityB relatedTo) {
        this.relatedTo = relatedTo;
    }

}

现在,使用 JDO,当我试图从表 MyEntityA 中删除一行时:

PersistenceManager pm = …
MyEntityA objectById = pm.getObjectById(MyEntityA.class,”abc”);
pm.deletePersistent(objectById)

或者喜欢:

PersistenceManager pm = …
MyEntityA objectById = pm.getObjectById(MyEntityA.class,”abc”);
objectById.setRelatedTo(null);
objectById.setCurrentClient(null);
pm.makePersistent(objectById);
pm.deletePersistent(objectById)

在这两种情况下,代码都会删除表 MyEntityA 中的行和表 MyEntityB 中的行,这些行在表 MyEntityA 中被引用。我希望我可以从 MyEntityA 中删除该行,但不要触摸 MyEntityB 表中的行。

有人可以帮帮我吗?

【问题讨论】:

  • 在 JPA 中,这个问题可以通过添加 removeOrphan = false 来解决。但这是 JDO,我找不到类似的东西。

标签: mysql mysql-workbench jdo jdoql


【解决方案1】:

我找到了正确的解决方案。在我与外键的关系类中,我不得不更改行

@Persistent(defaultFetchGroup = "true", dependent = "true")
to
@Persistent(defaultFetchGroup = "true", dependent = "false")

这是启发我的帖子:Is there any method like orphanRemoval of JPA in JDO with Kodo?

另外,官方文档:https://db.apache.org/jdo/api30/apidocs/javax/jdo/annotations/Persistent.html#dependent()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多