2009-08-19 119 views
5

我有2個實體:User和UsersList。休眠@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 
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()); 

其中

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

在步驟1我在USERS 3行(USER_ID)表。我在USERS_LIST(USERS_LIST_ID)表中有1行,並在連接表USERS_LIST_USERS(USER_ID,USERS_LIST_ID)3行中有1行。

我想在第3步中實現的是如下:當我從表中刪除一個用戶USERS - 假設USER_ID = 4的用戶,我只想從聯接表刪除USER_ID = 4的行,其他人留下。

有沒有註解解決我的問題?

+0

deleteWithHibernate看起來像什麼方法? – 2009-08-19 12:00:37

回答

-1

我想你一定因爲這annotaion

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

和變化cascade.remove到CascadeType.ALL 你的代碼必須是這樣的

@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是hibernate特定的註釋,並且在JPA中不可用。 – Mohsen 2013-04-26 19:58:01

9

你需要的是@JoinTable屬性:

Hibernate並不知道多對多關係是相互引用的,並且可能會創建兩個連接表。如果您在關係的兩側指定相同的@JoinTable,它將按預期工作。

確保joinColumn和inverseJoinColumn在關係的相對方 兩側是相反的。

  • 一側== inverseJoinColumn joinColumn在另一邊
  • 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 2012-02-06 13:44:15

+1

OP使用'mappedBy',這對於hibernate來說是不是知道'@ JoinTable'應該是什麼樣子?明確列出'@ JoinTable'名稱和列似乎有點多餘,除非您確實想確保使用您的確切名稱。 – fommil 2012-08-13 11:31:56

+0

偉大的解決方案! – kinkajou 2013-09-14 00:59:45