2013-05-04 1 views
2

У меня есть базовая настройка Java-проекта с использованием JPA. У меня есть классы, которые аннотируются правильно и могут без проблем вставлять данные в мою базу данных PostgreSQL.EntityManager remove() call not update database

Мой вопрос ... и я могу найти, что мне нужно, чтобы добавить больше деталей здесь ...

Это я называю «em.remove (MyObject)», где «эм» является EntityManager. Я могу видеть изменения объекта при отладке, но после завершения приложения мои изменения не отражаются в базе данных.

Будет ли вызов .remove() обновить базу данных или мне также нужно добавить вызов .flush()? Я пробовал это в Google и, должно быть, чего-то не хватает.

Спасибо!

+0

Вы читаете объект из базы данных в той же транзакции, прежде чем удалить ее? – clav

+0

Да, это часть той же транзакции. –

+2

Если это не отдельный экземпляр, тогда вызов удаления должен работать. Если он отсоединен, вам сначала нужно будет управлять им с помощью Object Object = em.merge (myObject); 'и затем вызвать remove на' managed'. – clav

ответ

0

Я обнаружил, что мне также необходимо определить тип каскада.

@ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "QUESTION_ID", nullable = false) 
    private Question question; 
+0

, вы должны добавить только каскад, если хотите удалить и удалить связанный объект Question. Cascade.REMOVE означает, что удаление объекта myObject будет выполняться и на объекте Question –

0

Звонок remove должен удалить объект из базы данных. Однако в зависимости от настроек кэширования это может не произойти немедленно. И если у вас есть какое-то ограничение, которое будет нарушено при удалении, тогда, когда он попытается обновить базу данных, он будет генерировать исключение, и удаление будет неудачным. Если вам действительно нужно гарантировать, что это произойдет или произойдет немедленно, тогда да, вам нужно будет позвонить flush.