0

私は持っている

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Linf getLinf() {
    return linf;
}

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = MessageEntry.class)
public Set<MessageEntry> getMessageEntries() {
    return messageEntries;
}

データベースから単一の messageEntry を削除する必要があります。sess.delete(messageEntry) と言うと、Linf.messageEntries コレクションにあるため、インデックス例外が発生します。ステートレス セッションはコレクションを読み込めないため、Linf.messageEntries の要素を手動で読み込んでから、そのうちの 1 つを削除する必要があります。

            List linfs = sess.createQuery(
                    "SELECT l FROM Linf l " +
                            "JOIN l.messageEntries e WHERE e=:e")
                    .setParameter("e", messageEntry).list();

            if (linfs.size()>1) throw new RuntimeException();

            Linf linf = (Linf) linfs.get(0);

            List<MessageEntry> curEntries =
                    sess.createQuery(
                            "SELECT e FROM Linf l " +
                            "JOIN l.messageEntries e WHERE l=:l")
                            .setParameter("l", linf).list();

            for (int i = 0; i < curEntries.size(); i++) {
                if (curEntries.get(i).getId().equals(messageEntry.getId())) {
                    curEntries.remove(i);
                    break;
                }
            }

            Set<MessageEntry> cur = new HashSet<MessageEntry>();
            cur.addAll(curEntries);
            linf.setMessageEntries(cur);

            messageEntry.setLinf(null);
            sess.update(messageEntry);
            sess.update(linf);
            sess.delete(messageEntry);

ConstraintViolationException: Cannot delete or update a parent row: a Foreign key constraint fails ( db. linf_messageentry, CONSTRAINT FK5039A8B5E770809AFOREIGN KEY ( messageEntries_id) REFERENCES messageentry( id)) が発生します。このタスクを実行するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1