2011-08-03 19 views
1
@Entity 
public class User{ 

    @ElementCollection 
    @Enumerated(EnumType.STRING) 
    @CollectionTable(name = "SEC_USER_ROLES", 
    joinColumns = 
    @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    @Column(name = "ROLE_NAME") 
    private List<Role> roles; 

    [...] 

} 

public enum Role { 

    ROLE_SUPER_ADMIN, 
    ROLE_ADMIN, 
    ROLE_ARB, 
    ROLE_AP; 

    [...] 
} 

有了這個映射,當我試圖做刪除一個角色,例如ROLE_ARB,它總是與刪除角色,並再次將它結束了。@ElementCollection,@CollectionTable和枚舉 - 斯特蘭奇刪除/插入行爲

DELETE FROM SEC_USER_ROLES WHERE ((USER_ID = ?) AND (ROLE_NAME = ?)) 

    bind => [9451, ROLE_ADMIN] 

INSERT INTO SEC_USER_ROLES (USER_ID, ROLE_NAME) VALUES (?, ?) 

    bind => [9451, ROLE_ADMIN] 

我試圖解決與@OrderColumn問題(名稱=「USER_ID」),但隨後User_id的映射是不正確的。

任何想法,將不勝感激。

的作用表示爲selectManyCheckbox 的ManagedBean準備的實體(用戶)

... 
    List<String> selectedroles = this.getSelectedItems(); 
    List<Role> newroles = new ArrayList<Role>(); 
    if (selectedroles != null) { 
    for (String r : selectedroles) { 
    newroles.add(Role.valueOf(r)); 

      } 
    getEntity().setRoles(newroles); 
    ...  
    security.save(getEntity()); 

和EJB使得更新,如果它是一個現有實體

EntityManager em; 
    ... 
    this.em.merge(user); 

因此,當有人取消選擇所有(之前選擇的)角色總是存在一個角色留在數據庫中,因爲我之前描述的刪除/插入行爲而未被刪除。

+1

您能告訴我們用於從用戶中刪除角色的代碼嗎?你確定你沒有另外的列表引用,並重新添加角色? –

+0

我使用所需的代碼編輯了問題。我相信我沒有別的參考。 – mejas

回答

2

@OrderColumn解決了問題