@ElementCollection,@ CollectionTable和Enum - 奇怪的删除/插入行为

时间:2011-08-03 12:11:46

标签: java hibernate orm jpa jpa-2.0

@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时,例如ROLE_ARB,它最终会删除角色并再次插入。

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(name =“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 :(得分:2)

@OrderColumn解决了问题