2

내 팀웍 지향적 인 애플리케이션에서 나는 사용자와 팀간에 다 - 대 - 다 관계가 있으므로 최대 절전 모드는 연관 테이블을 만든다. 문제는 팀을 가진 사용자를 업데이트 한 후, 최대 절전 모드가 USER_TEAM 테이블에서 해당 연결 레코드를 삭제한다는 것입니다.Hibernate는 업데이트 후 many-to-many 연관 테이블에서 레코드를 삭제한다.

사용자 엔티티 :

@Entity 
@Table(name="USERS") 
public class User extends SelectItem { 

@Id 
@Column(name="EMAIL") 
private String email; 

@Column(name="PASSWORD") 
private String password; 

@Column(name="NAME") 
private String name; 

@Column(name="GROUPNAME") 
private String group; 

@ManyToMany(
    targetEntity=Team.class 
) 
@ForeignKey(name="FK_TEAM_TO_USER", inverseName = "FK_USER_TO_TEAM") 
@JoinTable(
    name="USER_TEAM", 
    [email protected](name="EMAIL"), 
    [email protected](name="TEAMNAME") 
) 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<Team> teamList; 

@OneToMany(
     fetch = FetchType.EAGER, 
     mappedBy="user") 
private List<Invitation> invitationList; 

//getters setters 

팀 엔티티 :

정보 : 2012년 11월 20일 22 : 50 : 00,170 DEBUG의 org.hibernate 여기

@Entity 
@Table(name="TEAM") 
public class Team extends SelectItem { 

@Id 
@Column(name="TEAMNAME") 
private String name; 

@ManyToOne 
@ForeignKey(name="FK_TEAM_TO_TEAMLEADER") 
@JoinColumn(name="TEAMLEADER") 
private User teamLeader; 

@ManyToMany(
    mappedBy = "teamList", 
    targetEntity = User.class 
) 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<User> memberList; 

//getters setters 

로그입니다. transaction.JDBCTransaction.begin : begin
INFO : 20.11.2012 22 : 50 : 00,175 DEBUG org.hibernate.transaction.JDBCTransaction .begin : 현재 자동 커밋 상태 : 사실
정보 : 2012년 11월 20일 22 : 50 : 00,175 DEBUG의 org.hibernate.transaction.JDBCTransaction.begin : 해제 자동 커밋
정보 : 2012년 11월 20일 22 : 50 : 00,175 DEBUG의 hibernate.jdbc. util.SQLStatementLogger.logStatement : user_.EMAIL, user_.GROUPNAME을 GROUPNAME0_, user_.NAME을 NAME0_, user_.PASSWORD를 PASSWORD0_ USERS user_ 중에서 선택하십시오. 여기서 user_.EMAIL =?
정보 : 최대 절전 모드 : user_.EMAIL, user_.GROUPNAME을 GROUPNAME0_, user_.NAME을 NAME0_, user_.PASSWORD를 PASSWORD0_ USERS user_ 중에서 선택하십시오. 여기서 user_.EMAIL =?
INFO : 20.11.2012 22 : 50 : 00,176 TRACE type.descriptor.sql.BasicBinder.bind : 바인딩 매개 변수 [1]을 [VARCHAR] - [email protected]으로
정보 : 20.11.2012 22 : 50 : 00,177 TRACE type.descriptor.sql.BasicExtractor.extract : [GROUPNAME0_] 열로 사용자를 찾았습니다.
INFO : 20.11.2012 22 : 50 : 00,178 TRACE type.descriptor.sql.BasicExtractor.extract : found [default] as column [ NAME0_]
INFO : 20.11.2012 22 : 50 : 00,178 TRACE type.descriptor.sql.BasicExtractor.extract : 열 [PASSWORD0_]으로 [기본값]
정보 : 20.11.2012 22 : 50 : 00,251 DEBUG org.hibernate .transaction.JDBCTransaction.commit : 커밋
정보 : 20.11.2012 22 : 50 : 00,252 디버그 hibernate.jdbc.util.SQLStatementLogger.logStatement : 업데이트 USER S는 GROUPNAME =?, NAME =?, PASSWORD =?를 설정합니다. 여기서 EMAIL =?
INFO : 최대 절전 모드 : USERS 세트를 GROUPNAME = ?, NAME =?, PASSWORD =? 여기서 EMAIL =?
정보 : 20.11.2012 22 : 50 : 00,260 TRACE type.descriptor.sql.BasicBinder.bind : [VARCHAR] - 사용자 바인딩 매개 변수 [1]
정보 : 20.11.2012 22 : 50 : 00,261 TRACE 유형. descriptor.sql.BasicBinder.bind : 바인딩 매개 변수 [2] as [VARCHAR] - andy
정보 : 20.11.2012 22 : 50 : 00,261 TRACE type.descriptor.sql.BasicBinder.bind : 바인딩 매개 변수 [3]을 [VARCHAR ] - 중단
정보 : 20.11.2012 22 : 50 : 00,262 TRACE type.descriptor.sql.BasicBinder.bind : 바인딩 매개 변수 [4] [VARCHAR] - [email protected]
정보 : 20.11.2012 22 : 50 : 00,264 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement : USER_TEAM에서 삭제 어디 EMAIL =?
INFO : 최대 절전 모드 : USER_TEAM에서 삭제 : EMAIL =?
정보 : 20.11.2012 22 : 50 : 00,271 TRACE type.descriptor.sql.BasicBinder.bind : 바인딩 매개 변수 [1]을 (를) [VARCHAR] - [email protected]

정보 : 20.11.2012 22:50 : 00,274 DEBUG
org.hibernate.transaction.JDBCTransaction.toggleAutoCommit : 자동 커밋 다시 사용하기 INFO : 20.11.2012 22 : 50 : 00,274 org.hibernate.transaction.JDBCTransaction.커밋 : 업데이트 작업이 UserDAO이 간단한 방법으로 스프링의 HibernateTemplate에 의해 제공됩니다

최선을 다하고 JDBC 연결 :

public void saveUser(User user){ 
    hibernateTemplate.saveOrUpdate(user); 
}  

(나는 HibernateTemplate에 사용해서는 안 알아,하지만 난 생각이 아니다 이 문제의 지점)

그리고 DAO 방법은 단순히 스프링 서비스 콩 UserServiceImpl에 의해 트랜잭션에서 호출됩니다

@Transactional(readOnly=false) 
public void saveUser(User user){ 
    userDao.saveUser(user); 
} 


위에서 볼 수 있듯이 계단식 주석이없고 업데이트시 사용자 (EMAIL)의 PK가 변경되지 않으므로이 동작을 이해하지 못합니다. 나는 봄 3.1.0.RELEASE를 사용하고 최대 절전 모드 3.6.10. 최종.

의견이나 제안에 감사드립니다.

답변

4

이 문제가 발생하지 않으려면 캐스케이드가 필요하지 않습니다. 주어진 사용자에 대한 조인 테이블의 내용은이 사용자의 teamList 컬렉션의 내용에 의해 결정됩니다. 따라서 빈 팀리스트를 가진 User로 saveOrUpdate()을 호출하면, Hibernate는이 사용자에 대한 join table의 내용을 제거 할 것이다.

+0

네가 맞아. 부끄러운 줄 알았어. 나는이 관점에서 볼 수 없었다. 도움 주셔서 대단히 감사합니다. –