2 Stimmen

Hibernate enum @elementcollection nach Initialisierung gelöscht

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

2voto

audrius Punkte 41

Für zukünftige Googler: Es scheint, dass Hibernate 4.2 fehlerhaft ist, wenn enable_lazy_load_no_trans verwendet wird. Dieser Fehler könnte mit https://hibernate.atlassian.net/browse/HHH-7524 zusammenhängen

Es wurde protokolliert: log: ERROR AssertionFailure:43 - HHH000099: Es ist ein Assertionsfehler aufgetreten (dies könnte auf einen Fehler in Hibernate hindeuten, ist aber wahrscheinlicher auf unsichere Verwendung der Session zurückzuführen): org.hibernate.AssertionFailure: Sammlungseigentümer nicht mit Session verbunden: org.hibernate.test.ondemandload.Store.inventories WARN AbstractPersistentCollection:246 - Kann temporäre Sitzung nicht schließen, die zur Last von Lazy Collection verwendet wird, die mit keiner Sitzung verbunden ist

Ich benutze jetzt Hibernate 4.1.7 und alles funktioniert gut mit Lazy Loading.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X