JDO Удалить родительскую строку, не удаляя дочерние строки - PullRequest
0 голосов
/ 16 марта 2020

Мне нужно немного помочь, пытаясь удалить строку из родительской таблицы, но не удаляя потомков. У меня есть эта таблица 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. Я могу sh Я мог бы удалить строку из MyEntityA, но не трогать строки из таблицы MyEntityB.

Может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 16 марта 2020

Я нашел правильное решение. В моем классе отношений с моими внешними ключами я должен был изменить строку

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

Это сообщение, которое просветило меня: Есть ли какой-нибудь метод, как orphanRemoval из JPA в JDO с Kodo?

Также официальная документация: https://db.apache.org/jdo/api30/apidocs/javax/jdo/annotations/Persistent.html#dependent ()

...