So beheben Sie Hibernate LazyInitializationException: Eine Sammlung von Rollen konnte nicht verzögert initialisiert werden, Proxy konnte nicht initialisiert werden – keine Sitzung

Lesezeit: 13 Minuten

Benutzer-Avatar
Kleber Mota

In dem benutzerdefinierten AuthenticationProvider aus meinem Frühlingsprojekt versuche ich, die Liste der Autoritäten des angemeldeten Benutzers zu lesen, aber ich sehe den folgenden Fehler:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.horariolivre.entity.Usuario.autorizacoes, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
    at com.horariolivre.security.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:45)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177)
    at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Wenn ich andere Themen von hier in StackOverflow lese, verstehe ich, dass dies aufgrund der Art und Weise geschieht, wie diese Art von Attribut vom Framework behandelt wird, aber ich kann keine Lösung für meinen Fall finden. Jemand kann zeigen, was ich falsch mache und was ich tun kann, um es zu beheben?

Der Code meines Custom AuthenticationProviders lautet:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UsuarioHome usuario;

    public CustomAuthenticationProvider() {
        super();
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        System.out.println("CustomAuthenticationProvider.authenticate");

        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        Usuario user = usuario.findByUsername(username);

        if (user != null) {
            if(user.getSenha().equals(password)) {
                List<AutorizacoesUsuario> list = user.getAutorizacoes();

                List <String> rolesAsList = new ArrayList<String>();
                for(AutorizacoesUsuario role : list){
                    rolesAsList.add(role.getAutorizacoes().getNome());
                }

                List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
                for (String role_name : rolesAsList) {
                    authorities.add(new SimpleGrantedAuthority(role_name));
                }

                Authentication auth = new UsernamePasswordAuthenticationToken(username, password, authorities);
                return auth;
            }
            else {
                return null;
            }
        } else {
            return null;
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

}

Meine Entitätsklassen sind:

UsuarioHome.java

@Entity
@Table(name = "usuario")
public class Usuario implements java.io.Serializable {

    private int id;
    private String login;
    private String senha;
    private String primeiroNome;
    private String ultimoNome;
    private List<TipoUsuario> tipoUsuarios = new ArrayList<TipoUsuario>();
    private List<AutorizacoesUsuario> autorizacoes = new ArrayList<AutorizacoesUsuario>();
    private List<DadosUsuario> dadosUsuarios = new ArrayList<DadosUsuario>();
    private ConfigHorarioLivre config;

    public Usuario() {
    }

    public Usuario(String login, String senha) {
        this.login = login;
        this.senha = senha;
    }

    public Usuario(String login, String senha, String primeiroNome, String ultimoNome, List<TipoUsuario> tipoUsuarios, List<AutorizacoesUsuario> autorizacoesUsuarios, List<DadosUsuario> dadosUsuarios, ConfigHorarioLivre config) {
        this.login = login;
        this.senha = senha;
        this.primeiroNome = primeiroNome;
        this.ultimoNome = ultimoNome;
        this.tipoUsuarios = tipoUsuarios;
        this.autorizacoes = autorizacoesUsuarios;
        this.dadosUsuarios = dadosUsuarios;
        this.config = config;
    }

    public Usuario(String login, String senha, String primeiroNome, String ultimoNome, String tipoUsuario, String[] campos) {
        this.login = login;
        this.senha = senha;
        this.primeiroNome = primeiroNome;
        this.ultimoNome = ultimoNome;
        this.tipoUsuarios.add(new TipoUsuario(this, new Tipo(tipoUsuario)));
        for(int i=0; i<campos.length; i++)
            this.dadosUsuarios.add(new DadosUsuario(this, null, campos[i]));
    }

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "login", nullable = false, length = 16)
    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    @Column(name = "senha", nullable = false)
    public String getSenha() {
        return this.senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    @Column(name = "primeiro_nome", length = 32)
    public String getPrimeiroNome() {
        return this.primeiroNome;
    }

    public void setPrimeiroNome(String primeiroNome) {
        this.primeiroNome = primeiroNome;
    }

    @Column(name = "ultimo_nome", length = 32)
    public String getUltimoNome() {
        return this.ultimoNome;
    }

    public void setUltimoNome(String ultimoNome) {
        this.ultimoNome = ultimoNome;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "tipo_usuario", joinColumns = { @JoinColumn(name = "fk_usuario") }, inverseJoinColumns = { @JoinColumn(name = "fk_tipo") })
    @LazyCollection(LazyCollectionOption.TRUE)
    public List<TipoUsuario> getTipoUsuarios() {
        return this.tipoUsuarios;
    }

    public void setTipoUsuarios(List<TipoUsuario> tipoUsuarios) {
        this.tipoUsuarios = tipoUsuarios;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "autorizacoes_usuario", joinColumns = { @JoinColumn(name = "fk_usuario") }, inverseJoinColumns = { @JoinColumn(name = "fk_autorizacoes") })
    @LazyCollection(LazyCollectionOption.TRUE)
    public List<AutorizacoesUsuario> getAutorizacoes() {
        return this.autorizacoes;
    }

    public void setAutorizacoes(List<AutorizacoesUsuario> autorizacoes) {
        this.autorizacoes = autorizacoes;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "dados_usuario", joinColumns = { @JoinColumn(name = "fk_usuario") }, inverseJoinColumns = { @JoinColumn(name = "fk_dados") })
    @LazyCollection(LazyCollectionOption.TRUE)
    public List<DadosUsuario> getDadosUsuarios() {
        return this.dadosUsuarios;
    }

    public void setDadosUsuarios(List<DadosUsuario> dadosUsuarios) {
        this.dadosUsuarios = dadosUsuarios;
    }

    @OneToOne
    @JoinColumn(name="fk_config")
    public ConfigHorarioLivre getConfig() {
        return config;
    }

    public void setConfig(ConfigHorarioLivre config) {
        this.config = config;
    }
}

AutorizacoesUsuario.java

@Entity
@Table(name = "autorizacoes_usuario", uniqueConstraints = @UniqueConstraint(columnNames = "id"))
public class AutorizacoesUsuario implements java.io.Serializable {

    private int id;
    private Usuario usuario;
    private Autorizacoes autorizacoes;

    public AutorizacoesUsuario() {
    }

    public AutorizacoesUsuario(Usuario usuario, Autorizacoes autorizacoes) {
        this.usuario = usuario;
        this.autorizacoes = autorizacoes;
    }

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @OneToOne
    @JoinColumn(name = "fk_usuario", nullable = false, insertable = false, updatable = false)
    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    @OneToOne
    @JoinColumn(name = "fk_autorizacoes", nullable = false, insertable = false, updatable = false)
    public Autorizacoes getAutorizacoes() {
        return this.autorizacoes;
    }

    public void setAutorizacoes(Autorizacoes autorizacoes) {
        this.autorizacoes = autorizacoes;
    }

}

Autorizacoes.java

@Entity
@Table(name = "autorizacoes")
public class Autorizacoes implements java.io.Serializable {

    private int id;
    private String nome;
    private String descricao;

    public Autorizacoes() {
    }

    public Autorizacoes(String nome) {
        this.nome = nome;
    }

    public Autorizacoes(String nome, String descricao) {
        this.nome = nome;
        this.descricao = descricao;
    }

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "nome", nullable = false, length = 16)
    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name = "descricao", length = 140)
    public String getDescricao() {
        return this.descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

Vollständiges Projekt auf github verfügbar

–> https://github.com/klebermo/webapp_horario_livre

  • Holen Sie Ihre Autoritäten eifrig ab oder verwenden Sie einen OpenSessionInViewFilter.

    – Bart

    2. April 2014 um 19:59 Uhr

  • Es ist genau das, was ich versuche zu sehen, wie es geht. Was ich versucht habe war folgendes: List-Autorität = user.getAutorizacoes()innerhalb derselben Funktion aus der Zuweisung von UsernamePasswordAuthenticationToken, funktionieren aber immer noch nicht.

    – Kleber Mota

    2. April 2014 um 20:13 Uhr

  • @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)

    – Bart

    2. April 2014 um 20:16 Uhr

  • Ok, ich versuche das, aber es funktioniert immer noch nicht. Meine Entitätsklasse aktualisiert: github.com/klebermo/webapp_horario_livre/blob/master/src/com/…Mein aktueller AuthenticationProvider: github.com/klebermo/webapp_horario_livre/blob/master/src/com/…

    – Kleber Mota

    2. April 2014 um 20:31 Uhr

  • Mögliches Duplikat von So lösen Sie die Hibernate-Ausnahme „failed to faully initialize a collection of role“.

    – Martin Schröder

    8. August 2018 um 9:06 Uhr

Benutzer-Avatar
jcmwright80

Sie müssen entweder hinzufügen fetch=FetchType.EAGER in Ihren ManyToMany-Anmerkungen, um untergeordnete Entitäten automatisch zurückzuziehen:

@ManyToMany(fetch = FetchType.EAGER)

Eine bessere Option wäre, einen Spring TransactionManager zu implementieren, indem Sie Folgendes zu Ihrer Spring-Konfigurationsdatei hinzufügen:

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven />

Sie können Ihrer Authentifizierungsmethode dann eine @Transactional-Anmerkung wie folgt hinzufügen:

@Transactional
public Authentication authenticate(Authentication authentication)

Dadurch wird dann für die Dauer der Authentifizierungsmethode eine DB-Transaktion gestartet, sodass jede faule Sammlung aus der DB abgerufen werden kann, wenn Sie versuchen, sie zu verwenden.

  • Tatsächlich habe ich den TransactionManager in meiner Anwendung konfiguriert und verwende ihn in meinen DAO-Klassen. Wenn ich versuche, die Methode „authenticate from AuthenticationProvider“ wie von Ihnen vorgeschlagen zu verwenden, erhalte ich eine Fehlermeldung Verursacht durch: java.lang.IllegalArgumentException: Das Feld com.horariolivre.security.CustomAuthenticationProvider com.horariolivre.security.SecurityConfig.authenticationProvider kann nicht auf $Proxy36 gesetzt werden. Ich erhalte den gleichen Fehler, wenn ich den Zusatz fetchType=FetchType.EAGER in meiner ManyToMany-Anmerkung verwende (und ich kann dies nur in einem Attribut verwenden – ich habe drei gleiche Art in meiner Entitätsklasse Usuario).

    – Kleber Mota

    2. April 2014 um 20:57 Uhr

  • Nun, Sie müssen die untergeordneten Entitäten durchlaufen, die Sie innerhalb einer Transaktion verwenden möchten, um die LazyInitializationException zu vermeiden. Da sich Ihre transaktionale Anmerkung auf der Dao-Ebene einer generischen Methode befindet, möchten Sie dies dort wahrscheinlich nicht tun, sodass Sie eine Dienstklasse vor dem Dao implementieren müssen, die die @Transactional-Grenzen hat, innerhalb derer Sie gehen können gewünschte untergeordnete Entitäten

    – jcmwright80

    2. April 2014 um 21:32 Uhr

  • Protip für jemanden, der dies für die Zukunft erlebt; @Transaction muss sich auf einer öffentlichen Methode befinden. Ist dies nicht der Fall, wird dies nicht funktionieren. Es können Warnungen vorhanden sein oder auch nicht.

    – Nikolaus

    20. Januar 2020 um 15:03 Uhr

  • Ich habe den Fetch-Typ verwendet und es hat perfekt funktioniert. Frage, was der Unterschied zwischen der Verwendung des Eifer-Fetch und dem @transactional-Gegenstück ist

    – Austine Gwa

    4. September 2020 um 0:58 Uhr

  • @AustineGwa Der Hauptunterschied besteht darin, dass das Hinzufügen des Eager fetchType zum Join bedeutet, dass die Liste der untergeordneten Entitäten immer aus der DB zurückgezogen wird, wenn die Hauptentität geladen wird, sodass es zu einem potenziellen Leistungseinbruch kommt, wenn es Funktionsbereiche gibt, die nur erforderlich sind die Daten von der Hauptentität, sodass Sie durch die Verwendung von Transaktionen und Lazy Loading mehr Kontrolle über die Datenmenge haben, die zurückgezogen wird, aber es hängt vollständig von Ihrer Anwendung und Ihren Anwendungsfällen ab, welcher Ansatz für Sie der richtige ist.

    – jcmwright80

    4. Dezember 2020 um 15:51 Uhr


Benutzer-Avatar
Vlad Mihalcea

Der beste Weg, um damit umzugehen LazyInitializationException ist die zu verwenden JOIN FETCH Direktive für alle Entitäten, die Sie mitnehmen müssen.

Verwenden Sie auf jeden Fall NICHT die folgenden Anti-Patterns, wie in einigen der Antworten vorgeschlagen:

Manchmal, ein DTO-Projektion ist eine bessere Wahl als das Abrufen von Entitäten, und auf diese Weise erhalten Sie keine LazyInitializationException.

  • fetch join ist äquivalent zu eifrigem Abrufen. Was möglicherweise nicht immer machbar oder effizient ist. Auch die übliche Methode zum Abrufen von Objekten erfolgt nicht über jpql-Abfragen. Die Tatsache, dass die offene Sitzung ein Antimuster ist, ist weit hergeholt, und ehrlich gesagt bin ich anderer Meinung. Es sollte natürlich mit Vorsicht verwendet werden, aber es gibt viele sehr gute Anwendungsfälle, die davon profitieren.

    – fer.marino

    7. Juni 2017 um 8:39 Uhr

  • Nein, es ist NICHT. Offene Sitzung in Ansicht ist hacken und ein Zeichen, dass Entitäten auch für Nur-Lese-Projektionen abgerufen werden. So etwas wie ein gibt es nicht viele perfekte Anwendungsfälle, die davon profitieren, egal wie sehr Sie versuchen werden, es zu rechtfertigen. Es gibt keine Entschuldigung dafür, mehr Daten als Sie abzurufen Ja wirklich Bedarf, und es gibt keine Entschuldigung dafür, Daten durchsickern zu lassen, die außerhalb der Grenzen der Transaktionsdienstschicht abgerufen werden.

    – Vlad Mihalcea

    7. Juni 2017 um 9:01 Uhr


  • HALLO Vlad, können Sie bitte erklären, warum FETCH JOIN nicht gleichbedeutend mit eifrigem Laden ist. Ich gehe diesen Artikel durch: blog.arnoldgalovics.com/2017/02/27/… . Und es heißt: “Eine bessere Idee ist, die Beziehung zu dem Zeitpunkt zu laden, zu dem Sie die übergeordnete Entität – Unternehmen – laden. Dies kann mit einem Fetch Join erfolgen.” Es ist also ein eifriges Laden. Ist es nicht?

    – Aussenseiter

    8. Januar 2018 um 3:13 Uhr

  • Eifriges Führen bedeutet Hinzufügen FetchType.EAGER zu Ihren Vereinen. JOIN FETCH ist für FetchType.LAZY Assoziationen, die zur Abfragezeit eifrig abgerufen werden müssen.

    – Vlad Mihalcea

    8. Januar 2018 um 6:24 Uhr

Benutzer-Avatar
Jamali

Hinzufügen der folgenden Eigenschaft zu Ihrer persistence.xml kann Ihr Problem vorübergehend lösen

<property name="hibernate.enable_lazy_load_no_trans" value="true" />

Wie @vlad-mihalcea sagte, ist es ein Antimuster und löst das Problem der verzögerten Initialisierung nicht vollständig. Initialisieren Sie Ihre Zuordnungen, bevor Sie die Transaktion schließen, und verwenden Sie stattdessen DTOs.

  • Dies wird von einem Hibernate-Experten stackoverflow.com/users/1025118/vlad-mihalcea als Anti-Pattern angesehen

    – Zon

    21. März um 14:15 Uhr

Ich hatte dieses Problem auch, als ich Unit-Tests durchführte. Eine sehr einfache Lösung für dieses Problem ist die Verwendung @Transaktion Anmerkung, die die Sitzung bis zum Ende der Ausführung offen hält.

Benutzer-Avatar
saneryee

Der Grund dafür ist, dass die Sitzung geschlossen wird, wenn Sie Lazy Load verwenden.

Es gibt zwei Lösungen.

  1. Verwenden Sie kein faules Laden.

    Satz lazy=false in XML oder Set @OneToMany(fetch = FetchType.EAGER) In Anmerkung.

  2. Lazyload verwenden.

    Satz lazy=true in XML oder Set @OneToMany(fetch = FetchType.LAZY) In Anmerkung.

    und hinzufügen OpenSessionInViewFilter filter in deiner web.xml

Details Siehe meinen Beitrag.

https://stackoverflow.com/a/27286187/1808417

  • OpenSessionInViewFilter ist ebenfalls ein Anti-Pattern. Ich schlage auch vor, niemals eine Zuordnung auf EAGER festzulegen, da es viele Fälle geben wird, in denen Sie diese Daten in der EAGER-Sammlung nicht benötigen und Sie viel mehr Daten abrufen werden, als diese Anwendungsfälle benötigen, und Ihre Leistung erheblich verringern. Bitte halten Sie alle Mappings LAZY und fügen Sie stattdessen Join-Fetches zu Ihren Abfragen hinzu.

    – bytor99999

    29. September 2016 um 8:14 Uhr

  • “und fügen Sie stattdessen Verknüpfungsabrufe zu Ihren Abfragen hinzu”. Was bedeutet das?

    – Daniel Metner

    11. November 2021 um 8:25 Uhr

Benutzer-Avatar
Bilal Ahmed Yaseen

Ihre benutzerdefinierte AuthenticationProvider-Klasse sollte mit den folgenden Anmerkungen versehen sein:

@Transaktion

Dadurch wird sichergestellt, dass die Hibernate-Sitzung auch dort vorhanden ist.

  • OpenSessionInViewFilter ist ebenfalls ein Anti-Pattern. Ich schlage auch vor, niemals eine Zuordnung auf EAGER festzulegen, da es viele Fälle geben wird, in denen Sie diese Daten in der EAGER-Sammlung nicht benötigen und Sie viel mehr Daten abrufen werden, als diese Anwendungsfälle benötigen, und Ihre Leistung erheblich verringern. Bitte halten Sie alle Mappings LAZY und fügen Sie stattdessen Join-Fetches zu Ihren Abfragen hinzu.

    – bytor99999

    29. September 2016 um 8:14 Uhr

  • “und fügen Sie stattdessen Verknüpfungsabrufe zu Ihren Abfragen hinzu”. Was bedeutet das?

    – Daniel Metner

    11. November 2021 um 8:25 Uhr

Für diejenigen, die dieses Problem haben mit Aufzählungszeichen hier ist, wie man es löst:

@Enumerated(EnumType.STRING)
@Column(name = "OPTION")
@CollectionTable(name = "MY_ENTITY_MY_OPTION")
@ElementCollection(targetClass = MyOptionEnum.class, fetch = EAGER)
Collection<MyOptionEnum> options;

  • Das funktioniert für mich. Ich habe auch die Option zum Hinzufügen von @Transactional getestet und es funktioniert auch. Aber ich wähle diese Option.

    – Rick Dana

    3. April 2020 um 8:44 Uhr

1346570cookie-checkSo beheben Sie Hibernate LazyInitializationException: Eine Sammlung von Rollen konnte nicht verzögert initialisiert werden, Proxy konnte nicht initialisiert werden – keine Sitzung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy