2011-08-03 3 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のために、1つのROLEを削除しないしようとすると、それは常に役割を削除し、もう一度それを挿入して終わります。@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] 

Iは@OrderColumn(名=「USER_ID」)の問題を解決しようとしたが、その後User_idのマッピングが正しくありません。

何か考えていただければ幸いです。 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()); 

を準備selectManyCheckbox として

役割が表現され、それが既存のエンティティだから、

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

であれば、誰かが(すべての選択を解除するときEJBが更新を作ります前回選択)ロールデータベースには、前に説明した削除/挿入動作のために、削除されていないロールが常に1つあります。

+1

ユーザーからロールを削除するコードを教えてください。あなたはどこか別のリストを参照しておらず、そのロールをそこに再追加してもよろしいですか? –

+0

私は必要なコードで質問を編集しました。私は別の参照を持っていないと確信しています。 – mejas

答えて

2

@OrderColumnが問題を解決しました