2013-06-01 6 views
0

을 저장 코드 :최대 절전 모드 @ManyToMany 나는 다음과 같이 내 코드에서 견인 테이블 (사용자 및 사업) 사이의 @ManyToMany 관계를 가지고

... 
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 (?, ?) 

편집 : 내가 수동으로 실행하여 문제를 해결하기

는 는하지만 난 여전히 최고의 솔루션 :(

User User = (User) DataAccessUtils 
      .singleResult((getHibernateTemplate().find(
        "From User WHERE id = ?", idUser))); 
    User.getWorks().add(work); 
    getHibernateTemplate().saveOrUpdate(User); 

답변

1

당신이 추가 할 때마다 찾고 있어요 데이터베이스에 이미 존재하는 사용자에게 작업하는 경우 새 사용자를 생성하고 (이미 존재 함에도 불구하고) 단일 요소를 포함하는 작업 세트를 할당 한 다음 기존 사용자를 th로 업데이트합니다 새로운 하나. 물론 결과는 기존 작업 집합이 단일 요소가 포함 된 새로운 작업 집합으로 대체된다는 것입니다.

데이터베이스에 이미 있으므로 새 사용자를 만들어서는 안됩니다. 대신, 데이터베이스에서 기존 사용자를 얻고, 작품의 자신의 세트에 새로운 작업을 추가

// 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(); 사용자 사용자 = (사용자) session.get (사용자. 클래스, idUser); 세트 groupsList = new HashSet (); groupsList.add (group); User.setGroups (groupsList); getHibernateTemplate(). saveOrUpdate (User); session.close(); 하지만 여전히 동일한 문제가 있습니다 – z4k4r14

+0

하나의 작업이 포함 된 새로운 세트로 대체하기 때문에 여전히 마찬가지입니다. 사용자가 가지고있는 일련의 작업에 작업을 추가해야합니다. 세트를 새 것으로 교체하지 마십시오. 'user.getGroups(). add (work);'. 지갑에 동전을 추가하면 새 지갑을 만들지 않고 동전을 새 지갑에 넣고 주머니에있는 지갑을 새 지갑으로 교체하십시오. 이미 동전이 들어있는 주머니에서 기존 지갑을 가져 와서 새 동전을 안에 넣으십시오. 여기와 같아. –

+0

나는 그것을 시도하지만 그것은 나를 위해 작동하지 않았다. .. 나는 흐르는 기능을 시도해보십시오 공공 무효 addWorkToUser (작업 일, 정수 idUser) { \t \t 세션 세션 = getHibernateTemplate를() getSessionFactory getCurrentSession()에(); \t \t session.beginTransaction(); \t \t 사용자 사용자 = (사용자) session.get (사용자. 클래스, idUser); \t \t session.saveOrUpdate (work); \t \t User.getGroups(). add (work); \t \t 세션.saveOrUpdate (사용자); \t \t session.flush(); \t \t session.close(); } – z4k4r14