2014-01-28 71 views
0

我有3個表:處於休眠刪除用戶實體的角色被刪除,以及

user: (id,username,password) 
role: (id,role) 
user_roles: (user_id, role_id) 

和以下兩個Hibernate的實體:

用戶:

@Entity 
@Table(name = "user") 
public class User implements Serializable{ 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String userName; 
    private String password; 
    private boolean active = false; 
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
    @JoinTable(name = "user_roles", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = "id") }) 
    private Set<Role> roles = new HashSet<Role>(); 
.... 

作用:

@Entity 
@Table (name = "roles") 
public class Role implements Serializable { 
@Id @GeneratedValue 
private Long id; 
private String role; 
.... 

當我現在刪除用戶時,相應的角色也會從「角色」表中刪除,而不是刪除用戶行和user_roles關係。即使其他用戶仍與該角色有關。我使用以下來刪除用戶。

@Transactional 
public void deleteByName(String userName) { 
    User user = this.getByName(userName); 
    Session session = sessionFactory.getCurrentSession(); 
    session.delete(user); 
} 

任何人都知道爲什麼以及如何解決這個問題?

謝謝

回答

2

這是當前映射的預期行爲。它是由cascade設置進行配置:

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
private Set<Role> roles = new HashSet<Role>(); 

如果你不想當用戶要刪除的角色呢,你將不得不縮小級聯設置。現在你正在使用ALL。這相當於{PERSIST, REMOVE, REFRESH, MERGE, DETACH}。決定你需要哪些,並刪除其他人。

有一件事我不明白。你說這些角色被刪除了「即使其他用戶仍然與該角色有關」。這應該是不可能的。

RoleUser的關係是多對一的,所以只能有一個用戶連接到一個角色。

+0

確保刪除cacade它不在數據庫上 – jcrada

+0

我只是假設沒有,因爲級聯的行爲配置將是多餘的。如果刪除級聯消失,但級聯刪除仍然發生,我會查看數據庫。 – kostja

+0

感謝您的回答,我只注意到我的問題是OneToMany關係。當我創建用戶時,我大多使用相同的角色。例如user1和user2的「USER_ROLE」。我可能需要一個ManyToMany關係。是對的嗎? – clausmc