2011-08-03 2 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의지도가 정확하지를 해결하기 위해 노력했다.

어떤 아이디어라도 감사 할 것입니다. 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

사용자로부터 역할을 삭제하는 데 사용 된 코드를 표시해주십시오. 어딘가에 목록에 대한 다른 참조 정보가 없으시 고 그 역할을 다시 추가 하시겠습니까? –

+0

나는 필요한 코드로 질문을 편집했다. 나는 또 다른 언급이 없다고 확신한다. – mejas

답변

2

@OrderColumn이 문제를 해결했습니다.

관련 문제