2013-06-01 7 views
0

У меня есть @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); 

ответ

1

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

Нельзя создавать нового пользователя, поскольку он уже существует в базе данных. Вместо этого, получить существующий пользователь из базы данных, а также добавить новую работу в свой комплекс работ:

// if the work isn't persistent yet: 
session.persist(work); 

User user = (User) session.get(User.class, idUser); 
user.addWork(work); 
// nothing else needed 
+0

я изменить свой код следующим образом:. сессии сессии = getHibernateTemplate() getSessionFactory() getCurrentSession(). ; session.beginTransaction(); Пользователь User = (Пользователь) session.get (User.class, idUser); groupsList = new HashSet (); groupsList.add (группа); User.setGroups (groupsList); getHibernateTemplate(). SaveOrUpdate (Пользователь); session.close(); Но у меня все еще такая же проблема – z4k4r14

+0

Потому что вы все равно заменяете набор на новый, содержащий одну работу. Вы должны добавить работу к набору работ, которые есть у пользователя. Не заменять набор на новый. . 'user.getGroups() добавить (работы);'. Когда вы добавляете монету в свой кошелек, вы не создаете новый кошелек, не кладете монетку в новый кошелек и не заменяете бумажник в кармане новым. Вы берете свой существующий кошелек в кармане, уже содержащий монеты, и добавляете новую монету внутрь. Тоже самое. –

+0

Я стараюсь, но это не сработало для меня. .. Стараюсь с текущей функции: общественная пустота 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

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