2012-03-25 11 views
0

У меня есть следующий двунаправленные 1: п отношение между лицом пользователя и работой лицом:JPA сохраняется объект с cascase отношением, а затем удалить его (спящий режим)

Класс пользователя:

... 
    @OneToMany(mappedBy = "user",cascade={CascadeType.PERSIST}) 
    public Collection<Job> getJobs() { 
     return jobs; 
    } 

public void addJob(Job j) { 
    jobs.add(j); 
    j.setUser(this); 
} 
... 

класса Работой :

// Job class 
... 
@ManyToOne 
    public User getUser() { 
     return user; 
    } 

Теперь сохранение объекта пользователя (и пусть спящий режим автоматически сохранить объект задания) работает ... Затем, когда я хочу, чтобы удалить объект задания из БД я получаю п исключение ....

 User user = new User(); 
     user.addJob(new Job()); 


     entityManager.getTransaction().begin(); 
     entityManager.persist(user); 
     entityManager.getTransaction().commit(); 

     Job j = entityManager.find(Job.class, 1L); 

     entityManager.getTransaction().begin(); 
     entityManager.remove(j); 
     entityManager.getTransaction().commit(); 

Исключение:

Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction 
Caused by: javax.persistence.EntityNotFoundException: deleted entity passed to persist: [dst1.model.Job#<null>] 

почему это происходит? Кстати. когда я явно вызвать упорствовать с работой объекта проблема не возникает ... но я не хочу упорствовать работу отдельно, но пусть спящий режим сохраняется их (с каскадом, который на самом деле работает ....)

ТНХ

+0

У меня может быть идея, но я не уверен. не могли бы вы добавить 'entityManager.flush()' после первого коммита и сказать, что произойдет тогда. моя идея в том, что это зависит от вашей стратегии смывания ... – kraftan

+0

Привет, и спасибо за ваш ответ. Добавление entityManager.flush() не решает проблему. :/ – Moonlit

ответ

1

вы должны удалить задание от пользователя при удалении объекта:

entityManager.getTransaction().begin(); 
    j.getUser().getJobs().remove(j); 
    entityManager.remove(j); 
    entityManager.getTransaction().commit(); 

Или своего собственного предложение: Добавить orphanRemoval=true по сбору рабочих мест.

+0

Спасибо. Это сработало! Один из альтернативных способов, которые я усовершенствовал, - использовать orphanRemoval = true в коллекции заданий ... – Moonlit

+0

Вы должны принять решение, если у вас есть то, что ищете. – barsju

 Смежные вопросы

  • Нет связанных вопросов^_^