@ElementCollection, @CollectionTable und Enum - Seltsam delete/insert-Verhalten
@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;
[...]
}
Mit diesem mapping, wenn ich versuche, löschen einer ROLLE, zum Beispiel ROLE_ARB, es endet immer mit dem löschen der Rolle und fügt es dann wieder.
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]
Habe ich versucht das problem zu lösen mit @OrderColumn (name="USER_ID"), aber dann die Zuordnung der User_id
ist nicht korrekt.
Jede Idee wäre willkommen.
Werden die Rollen dargestellt, die als selectManyCheckbox
Die ManagedBean bereitet der Person (Benutzer)
...
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());
und der EJB-macht updates, wenn es eine bereits vorhandene Entität,
EntityManager em;
...
this.em.merge(user);
Also, wenn jemand hebt die Auswahl aller (zuvor ausgewählte) Rollen es ist immer einer Rolle Links in der Datenbank, die wird nicht gelöscht, da das löschen/einfügen von Verhalten, das ich beschrieben vor.
- Könnten Sie uns zeigen, den verwendeten code zu entfernen, der Rolle des Benutzers aus. Sind Sie sicher, dass Sie nicht eine andere Referenz von der Liste irgendwo und re-add die Rolle hinein?
- Ich bearbeitet die Frage mit den benötigten code. Ich bin sicher, dass ich nicht eine andere Referenz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
@OrderColumn das problem gelöst