У меня есть @ManyToMany соотношение между буксирными таблицами (User и Work) в моем коде следующим образом:Hibernate @ManyToMany сохранить
...
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "USER_WORK", joinColumns = {
@JoinColumn(name = "USER_ID") }, inverseJoinColumns = {
@JoinColumn(name = "WORK_ID")
})
@Cascade({CascadeType.ALL})
private Set<Work> works;
...
И когда я хочу, чтобы влиять на новую работу пользователя выполнить следующий код:
...
addWorkToUser(Work work,Integer idUser){
User user = new User();
user.setId(idUser);
Set<Work> worksList = new HashSet<Work>();
worksList.add(work);
user.setWorks(worksList);
getHibernateTemplate().saveOrUpdate(User)
}
...
Проблема в том, что я воздействую на новую работу в первый раз, все идет хорошо. Но когда я воздействую на новые woks тому же пользователю, я вижу только последнюю работу !!! Когда я отлаживаю код, я нашел запрос на удаление. Как я могу пропустить этот запрос на удаление?
Hibernate: update User set name=? where id=?
Hibernate: delete from USER_WORK where USER_ID=?
Hibernate: insert into USER_WORK (USER_ID, WORK_ID) values (?, ?)
EDIT:
Я обойти эту проблему, выполнив это вручную, Но я до сих пор ищет лучшее решение :(
User User = (User) DataAccessUtils
.singleResult((getHibernateTemplate().find(
"From User WHERE id = ?", idUser)));
User.getWorks().add(work);
getHibernateTemplate().saveOrUpdate(User);
я изменить свой код следующим образом:. сессии сессии = getHibernateTemplate() getSessionFactory() getCurrentSession(). ; session.beginTransaction(); Пользователь User = (Пользователь) session.get (User.class, idUser); groupsList = new HashSet (); groupsList.add (группа); User.setGroups (groupsList); getHibernateTemplate(). SaveOrUpdate (Пользователь); session.close(); Но у меня все еще такая же проблема –
z4k4r14
Потому что вы все равно заменяете набор на новый, содержащий одну работу. Вы должны добавить работу к набору работ, которые есть у пользователя. Не заменять набор на новый. . 'user.getGroups() добавить (работы);'. Когда вы добавляете монету в свой кошелек, вы не создаете новый кошелек, не кладете монетку в новый кошелек и не заменяете бумажник в кармане новым. Вы берете свой существующий кошелек в кармане, уже содержащий монеты, и добавляете новую монету внутрь. Тоже самое. –
Я стараюсь, но это не сработало для меня. .. Стараюсь с текущей функции: общественная пустота addWorkToUser (работа работы, Integer idUser) { \t \t сессия сессия = getHibernateTemplate() getSessionFactory() getCurrentSession(); \t \t session.beginTransaction(); \t \t Пользователь Пользователь = (Пользователь) session.get (User.class, idUser); \t \t session.saveOrUpdate (work); \t \t User.getGroups(). Add (work); \t \t сеанс.saveOrUpdate (Пользователь); \t \t Сессия.flush(); \t \t session.close(); } – z4k4r14