EclipseLink で、EntityManager#remove() を実行したところ、 以下のエラーが発生しました。

Entity must be managed to call remove: Entity[ id=601 ], try merging the detached and try the remove again.

対処方法を記載します。


前提

使用している EclipseLink の Version、 RDB は以下になります。

  • EclipseLink

    <!-- Eclipse Link -->
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.6.3</version>
    </dependency>

  • postgress

psql --version
---------------------------
psql (PostgreSQL) 9.5.2
---------------------------


参考


原因と対処

EntityManager で Manage な状態の Entity しか削除できないようです。
remove() を実行する前に、Manage な 状態にするため、 EntityManager#merge()実行します。

    /**
     * remove
     *
     * @param entity
     * @return
     */
    public T remove(T entity) {
        try {
            if (!em.contains(entity)) {
                entity = em.merge(entity);
            }
            em.remove(entity);
        } catch (ConstraintViolationException ex) {
            ConstraintViolationUtils.writeLogAndThrow(ex);
        }
        return entity;
    }

Detach と、Merge 、Remove の違いが未だあまり理解できておりません。
以上です。

コメント