Советы по устранению Hibernate / JPA EntityNotFoundException - PullRequest
3 голосов
/ 18 марта 2010

У меня проблема с Hibernate , когда при попытке удалить группу сущностей возникает следующая ошибка:

javax.persistence.EntityNotFoundException: deleted entity passed to persist: [com.locuslive.odyssey.entity.FreightInvoiceLine#<null>]

Обычно их не так сложно отследить, так как они обычно вызваны удалением сущности, но не удалением из коллекции, членом которой она является.

В этом случае я удалил сущность из каждого списка, который мог придумать (это сложная модель данных). Я включил регистрацию JBoss в Trace и вижу каскадные коллекции. Однако я не могу найти Коллекцию, содержащую сущность, которую я удаляю.

У кого-нибудь есть советы по разрешению этого конкретного исключения? Я особенно ищу способы определить, что может быть владельцем Коллекции.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Наконец-то нашел его, и это именно то разочарование "найти список", которое я ожидал.

Код, который выполнял удаление, расширял EntityHome в Seam.

public class FreightInvoiceHome extends EntityHome<FreightInvoice> {
    public void deleteLine(FreightInvoiceLine freightInvoiceLine) {
      getEntityManager().remove(freightInvoiceLine);
      freightInvoiceLine.getShipInstrLineItem().getFreightInvoiceLines().remove(freightInvoiceLine);

      /* These next two statements are effectively performing the same action on the same FreightInvoice entity
       * If I use the first one then I get the exception. If I use the second one then all is ok.
       */
      getInstance().getFreightInvoiceLines().remove(freightInvoiceLine);
      //freightInvoiceLine.getFreightInvoice().getFreightInvoiceLines().remove(freightInvoiceLine);
    }
}

Я подозревал, что это могло быть вызвано хитрым equals () / hashcode (), но после замены обоих различий нет.

Рад изменить принятого на другого, если он сможет объяснить разницу между ними.

2 голосов
/ 19 марта 2010

Я бы предложил сделать

getEntityManager () (удалить) freightInvoiceLine;.

как последний шаг. Я думаю, что это хорошая практика - сначала удалить ребенка из любых коллекций, а затем фактически удалить его. Во многих случаях это избавит от головной боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...