@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);
因此,当有人取消选择所有(之前选择的)角色时,由于我之前描述的删除/插入行为,数据库中总会留下一个未删除的角色。
答案 0 :(得分:2)
@OrderColumn解决了问题