@ElementCollection, @CollectionTable и Enum - Странное поведение удаления / вставки - PullRequest
1 голос
/ 03 августа 2011
@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 Ответ

2 голосов
/ 05 августа 2011

@ OrderColumn решил проблему

...