2014-11-24 3 views
0

안녕을 최대 절전 모드로 모든 열에 될 saveOrUpdate을 방지하는 방법 : 내가 노래를 추가 할 때내가 클래스 로그인이

public class Login { 

@Id 
@GeneratedValue 
@Column(name = "user_id") 
private int userId; 

@Column(name = "user_name", nullable=false) 
private String userName; 

@Column(name = "password", nullable=false) 
private String password; 

@ManyToMany 
@JoinTable(name = "user_songs_mapping", joinColumns = @JoinColumn(name = " user_id", 
referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "song_id", 
referencedColumnName = "song_id")) 
private List<Song> songs; 
} 

을, 나는 로그인 객체를 생성하고 목록의 노래, 사용자 이름, 암호를 설정하고 userId와 session.saveOrUpdate (login)라고 말하면됩니다. 매핑 테이블 (user_songs_mapping)에 user_id와 song_id 만 매핑되기를 원하지만, 암호가 발생할 때마다 사용자 이름이 업데이트됩니다. 어떻게 이것을 피할 수 있습니까?

답변

4

Hibernate는 로그인을 업데이트 할 것을 요청한다.이 로그인의 userName과 password는 null이므로 Login을 업데이트하고 userName과 password를 null로 설정한다. 기존 로그인 개체에 노래를 추가

Login existingLogin = (Login) session.get(Login.class, userId); 
existingLogin.addSong(song); 

그 코드를 원하는 작업을 수행합니다 : 그것은 당신이 그렇게하도록 지시하지 않는 한 실제로, 기존의 로그인 개체의 노래를 업데이트 할 것을 추측 할 수 에는 이미 userId, userName 및 password가 있으며 이는 그대로 있어야합니다.

+0

감사합니다 나열합니다. 그것은 효과가 있었다. 나는 지금 또 다른 문제가 있습니다. 항상 user_songs_mapping 테이블에 save (update 또는 저장하지 않음)라고 말하면 userId가 일치하는 이전 항목을 삭제하고 새 항목을 추가합니다. 나는 오래된 항목을 지우고 싶지 않습니다. 이런 식으로 사용자는 자신의 계정에 내가 원한 것이 아닌 하나의 노래 만 가질 수 있습니다. – kumuda

+0

안녕하세요. 무슨 일이 일어나고 있는지 알았어. login.addSong() 대신에 login.setSongs()를하고 있었다. – kumuda

1

발생하는 현상은 saveOrUpdate의 일반적인 동작이며 쉽게 변경할 수 없습니다.

이상적으로해야 할 일은 무엇입니까?

  • 변경 userId를하여

    1. 가져 오기 로그인 만 노래는
    2. 호출 될 saveOrUpdate
  • +3

    세 번째 단계는 쓸모가 없습니다. 관리 대상에 대한 모든 변경 사항은 트랜잭션이 끝날 때 (또는 이전에) 투명하게 유지됩니다. –

    관련 문제