2009-08-19 4 views
5

사용자와 사용자 목록이 2 개 있습니다.최대 절전 모드 @ManyToMany 관계 삭제

@Entity 
@Table(name = "USERS") 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private Long id; 

    @ManyToMany(cascade = CascadeType.REMOVE, mappedBy = "users") 
    private List<UsersList> usersLists = new ArrayList<UsersList>(); 

    public List<UsersList> getUsersLists() { 
     return usersLists; 
    } 

    public void setUsersLists(List<UsersList> usersLists) { 
     this.usersLists = usersLists; 
    } 
} 

이 같은

@Entity 
@Table(name = "USERS_LIST") 
public class UsersList { 
    @Id 
    @GeneratedValue 
    @Column(name = "ID") 
    private Long id; 

    @ManyToMany 
    private List<User> users = new ArrayList<User>(); 

public List<User> getUsers() { 
     return users; 
    } 

    public void setUsers(List<User> users) { 
     this.users = users; 
    } 
} 

코드 : 1 단계에서

deleteWithHibernate(Long id) { 
     User usr = hibernateTemplate.get(User.class, id); 
     hibernateTemplate.delete(usr); 
} 

I가 사용자에 3 개 행이

// 1 
List<User> dbUsers; // 3 the user instances are persisted in DB 
UsersList usersList = new UsersList(); 
usersList.setUsers(dbUsers); 

// 2 - now persist the usersList using hibernate... 
saveWithHibernate(usersList); 

//3 - delete using a persisted user 
deleteWithHibernate(dbUsers.get(0).getId()); 

(USER_ID) 도표 .

2 단계 (두 번째 주석) 다음에는 USERS_LIST (USERS_LIST_ID) 테이블과 조인 테이블 USERS_LIST_USERS (USER_ID, USERS_LIST_ID) 3 행에 1 행이 있습니다.

3 단계에서 달성하고자하는 것은 다음과 같습니다. USERS 테이블에서 한 명의 사용자를 삭제할 때 USER_ID = 4 인 사용자를 말하면 USER_ID = 4 인 행만 삭제할 수 있습니다. , 나머지는 남아 있습니다.

내 문제의 주석 솔루션이 있습니까?

+0

deleteWithHibernate 메서드는 어떻게 생겼습니까? –

답변

-1

은 어떻게 당신이 필요로하는 것은 @JoinTable 속성 당신이 CascadeType.ALL 이 annotaion로

@OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 

변경 cascade.remove 코드가이

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "users") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private List<UsersList> usersLists = new ArrayList<UsersList>(); 
+0

@OnDelete는 최대 절전 모드 별 주석이며 JPA에서는 사용할 수 없습니다. – Mohsen

9

과 같이해야합니다 생각합니다 :

Hibernate는 다 대다 관계가 서로를 참조하며 아마도 두 개의 조인 테이블을 생성한다는 것을 모릅니다. 릴레이션의 양쪽에 같은 @JoinTable을 지정하면 예상대로 작동합니다.

반대쪽에있는 관계의 에서 joinColumn과 inverseJoinColumn이 서로 반대인지 확인하십시오. 다른 측면

난이 도움이되기를 바랍니다 한쪽 == joinColumn 다른 측면

  • inverseJoinColumn에 한쪽 == inverseJoinColumn에

    • joinColumn.

      @Entity 
      public class Role extends Identifiable { 
      
          @ManyToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
          @JoinTable(name="Role_Permission", 
            [email protected](name="Role_id"), 
            [email protected](name="Permission_id") 
           ) 
          public List<Permission> getPermissions() { 
           return permissions; 
          } 
      
          public void setPermissions(List<Permission> permissions) { 
           this.permissions = permissions; 
          } 
      } 
      
      @Entity 
      public class Permission extends Identifiable { 
      
          @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
          @JoinTable(name="Role_Permission", 
            [email protected](name="Permission_id"), 
            [email protected](name="Role_id") 
           ) 
          public List<Role> getRoles() { 
           return roles; 
          } 
      
          public void setRoles(List<Role> roles) { 
           this.roles = roles; 
          } 
      
      } 
      
  • +1

    내 솔루션에서 '@JoinTable'을 사용하고 있지만 여전히 행을 삭제할 수 없습니다. 언급 한 모든 계단을 언급해야합니까? – Logan

    +1

    OP는'mappedBy'를 사용합니다. hibernate가'@ JoinTable'이 어떻게 보이는지 알기에는 충분하지 않습니까? '@ JoinTable' 이름과 열을 명시 적으로 나열하는 것은 약간의 불필요한 것으로 보이지만, 정확한 이름이 사용되고 있는지 확실히 확인하기를 원하지 않는다면 말입니다. – fommil

    +0

    그레이트 솔루션! – kinkajou

    관련 문제