web-dev-qa-db-ja.com

エンティティは、removeを呼び出すように管理する必要があります

何が起きてる?

@Stateless
@LocalBean
public class AppointmentCommentDao {
    public void delete(long appointmentCommentId) {
        AppointmentComment ac = em.find(AppointmentComment.class, appointmentCommentId);
        if (ac != null)
        {
            em.merge(ac);
            em.remove(ac);
        }
    }
    @PersistenceContext
    private EntityManager em;
}

removeを呼び出すと、IllegalArgumentExceptionが表示されます。メッセージはEntity must be managed to call remove: ...., try merging the detached and try the remove again.

14
Distortum

あなたの場合、acはem.findem.removeの間のどのポイントでも切り離されていないため、マージは必要ありません。

一般に、エンティティがデアタッチされると、EntityManagerのメソッドmergeはエンティティを引数として受け取り、マネージドインスタンスを返します。引数として指定されたエンティティは、アタッチされるように変換されません。これは、たとえばここで説明されています: EntityManager.merge 。あなたは行く必要があります:

    AppointmentComment toBeRemoved = em.merge(ac);
    em.remove(toBeRemoved);
18
Mikko Maunu

これを試して:

entity = getEntityManager().getReference(AppointmentComment.class, entity.getId());
getEntityManager().remove(entity);
6
Ismac