Сущность должна управляться, чтобы вызвать удаление

Что тут происходит?

@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.


person Distortum    schedule 18.02.2012    source источник
comment
Решил с помощью метода em.find(...).   -  person Andreas L.    schedule 07.10.2015


Ответы (2)


В вашем случае слияние не требуется, потому что ac не отсоединяется ни в одной точке между em.find и em.remove.

Обычно, когда сущность отсоединена, метод EntityManager merge принимает сущность в качестве аргумента и возвращает управляемый экземпляр. Сущность, указанная в качестве аргумента, не трансформируется для прикрепления. Это объясняется, например, здесь: EntityManager. объединить. Вы должны пойти на:

    AppointmentComment toBeRemoved = em.merge(ac);
    em.remove(toBeRemoved);
person Mikko Maunu    schedule 18.02.2012
comment
Странно... Без изменений в этом коде (хотя были и другие несвязанные изменения), он таинственным образом начал работать. Я даже полностью удалил слияние, потому что вся причина, по которой оно у меня было, в первую очередь заключалась в том, что я получал это исключение. В этом нет необходимости, потому что сущность должна быть присоединена, пока мы находимся в том же контексте персистентности, который ее загрузил. Что-то еще происходило, я думаю. Глупая стеклянная рыбка. - person Distortum; 18.02.2012
comment
Тем не менее, я понимаю вашу точку зрения, что вы должны использовать объект, возвращенный в результате слияния, а не переданный объект. +1 - person Distortum; 18.02.2012
comment
Вы абсолютно правы, ваш код должен работать без слияния, потому что ac не отсоединен ни в одной точке. Сначала я предположил, что это упрощенный пример. Я обновлю ответ. - person Mikko Maunu; 18.02.2012
comment
Отлично работает для новой ссылки на сущность. Спасибо. - person Lalith J.; 31.10.2014

Попробуй это:

entity = getEntityManager().getReference(AppointmentComment.class, entity.getId());
getEntityManager().remove(entity);
person Ismac    schedule 13.12.2012
comment
Этот ответ бесполезен, потому что он не дает никакого объяснения проблемы. - person Eduardo Yáñez Parareda; 14.11.2019