2013-06-16 2 views
3

Ну я немного смущен, потому что я просто не могу найти какое-либо решение по моей проблеме (может быть какой-то затемнение)JPA - обновление объектов в OneToMany-отношений

Допустим, у меня есть следующие (упрощенно) Сущности:

@Entity 
public class Employee { 
    @Id 
    private long id; 
    @OneToMany(mappedBy="owner") 
    private Collection<Phone> phones; 
} 

@Entity 
public class Phone { 
    @Id 
    private long id; 
    @ManyToOne 
    private Employee owner; 
} 

и у меня есть телефона объект, управляемый JPA. А теперь я хочу, чтобы изменить Сотрудник этого телефона объекта с чем-то вроде этого:

phone.setEmployee(otherEmployee); 

Я думал, что JPA обновит соответствующий сотрудник будет обновляться тоже. Я ошибаюсь? Я экспериментировал с аннотациями @ManyToOne и @OneToMany (cascade = CascadeType.ALL, orphanRemoval = true), но он не работает.

Должен ли я обновлять объект Employee самостоятельно? К сожалению, я не нашел этого случая ни в одном учебнике, ни в другом примере, поэтому я надеюсь, что вы можете рассказать мне больше, я смущен. Заранее спасибо.

Редактировать, чтобы сделать его еще более ясным:

Phone phone = new Phone(); 
Employee employee = new Employee(); 
phone.setEmployee(employee); 
em.persist(employee); 
em.persist(phone); 

employee.getPhones(); //the phone object should be included here. 
+0

Поскольку вы не удаляете, 'CascadeType.REMOVE' не принесет вам никакой пользы. Попробуйте вместо 'CascadeType.PERSIST' вместо' CascadeType.ALL'. Кроме того, я полагаю, что вы сохраняете объект 'phone' после того, как вы изменили отношение« Сотрудник », правильно? – Darwind

+0

Правильно, у меня был CascadeType.ALL, но, к сожалению, это не решение (теперь я отредактировал его для ясности). ** телефон ** с его владельцем был сохранен в БД и был прочитан 'em.find (...)'. И теперь я хочу изменить владельца. (И, конечно же, необходимо обновить соответствующий объект Employee-объекта) – Cyboot

+0

Итак, изменив владельца на другой объект «Сотрудник», вы вызвали em.merge (телефон) ;? – Darwind

ответ

6

link Это и есть ответ на ваш вопрос, вы должны управлять отношениями самостоятельно, т.е.. e .:

class Phone { 
... 
    void setEmployee(Employee employee) { 
     owner = employee; 
     employee.addPhone(phone); 
    } 
... 
} 
+1

Хорошо, что имеет смысл. Я бы справился с этим сам JPA. Спасибо! – Cyboot