JPA сохранить объект с каскадным отношением, а затем удалить его (спящий режим) - PullRequest
0 голосов
/ 25 марта 2012

У меня есть следующие двунаправленные отношения 1: n между объектом пользователя и объектом задания:

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

... 
    @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 (и пусть hibernate автоматически сохраняет объект задания) работает ... Затем, когда я хочу удалить объект задания из БД, я получаю исключение ....

        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>]

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

ТНХ

1 Ответ

1 голос
/ 25 марта 2012

Вам нужно удалить задание у пользователя при удалении сущности:

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

Или по вашему собственному предложению: Добавить orphanRemoval=true в коллекцию заданий.

...