@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);
Итаккогда кто-то отменяет выбор всех (ранее выбранных) ролей, в базе данных всегда остается одна роль, которая не удаляется из-за поведения удаления / вставки, которое я описал ранее.