Ich habe ein einfaches Enum:
public enum Privilege implements Serializable {
P1,
P2,
P3;
}
das in einer Entität wie folgt abgebildet wird:
@Entity
@Table(name = "rol_roles",
uniqueConstraints = {...)
public class Role extends AbstractSomething {
...
@ElementCollection(targetClass = Privilege.class, fetch = FetchType.LAZY)
@CollectionTable(name = "rol_roles_privileges",
joinColumns =
@JoinColumn(name = "role_id"))
@Column(name = "privilege", nullable = false)
@Enumerated(EnumType.STRING)
private Set privileges = EnumSet.noneOf(Privilege.class);
public Set getPrivileges() {
return privileges;
}
public void setPrivileges(Set privileges) {
this.privileges = privileges;
}
}
Jetzt, wenn ich versuche, die Entität mit gefüllten Elementen zu speichern - ist alles in Ordnung - die Entität wird ohne Probleme gespeichert. Wenn ich versuche, die Entität aus der Datenbank abzurufen, entscheidet Hibernate, dass er meine Sammlung nicht mag und löscht sie. SQL aus dem Log:
Hibernate:
select
role0_.id as id1_6_,
role0_.version_num as version2_6_,
role0_.code as code3_6_,
role0_.comments as comments4_6_,
role0_.title as title5_6_,
role0_.title_en as title6_6_,
role0_.valid_from as valid7_6_,
role0_.valid_till as valid8_6_
from
rol_roles role0_
where
role0_.id=?
Hibernate:
select
privileges0_.role_id as role1_6_0_,
privileges0_.privilege as privileg2_7_0_,
from
rol_roles_privileges privileges0_
where
privileges0_.role_id=?
Hibernate:
delete
from
rol_roles_privileges
where
role_id=?
Da die Sammlung faul ist, erfolgt die Behandlung und die Löschanweisung auf Sammlungsinitialisierung. Ich habe versucht, die @OrderColumn-Annotation hinzuzufügen, wie in einem ähnlichen Thread vorgeschlagen, aber das hat nicht geholfen. Es gibt keine Insert-Statements wie in ähnlichen Fällen, daher wird die Sammlung beim Lesen des Objekts einfach ausgeblendet. Die Tabelle wird wie folgt erstellt:
create table rol_roles_privileges (
role_id int8 not null,
privilege varchar(255) not null,
primary key (role_id, privilege)
);
Merkwürdigerweise (oder vielleicht auch nicht) funktioniert es, wenn ich fetchtype.EAGER setze - aber sollte es nicht auch auf lazy funktionieren?
Ich benutze Hibernate 4.2.0.Final, SpringData, PostreSQL und hibernate.enable_lazy_load_no_trans