Hibernate LazyInitializationException nasıl düzeltilir: bir rol koleksiyonu tembel olarak başlatılamadı, proxy başlatılamadı - Oturum yok


104

İlkbahar projemdeki özel AuthenticationProvider'da, giriş yapan kullanıcının yetki listesini okumaya çalışıyorum, ancak şu hatayla karşılaşıyorum:

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)

Buradan StackOverflow'da diğer konuları okurken, bunun bu tür bir atribute'un çerçeve tarafından ele alınma biçiminden kaynaklandığını anlıyorum, ancak durumum için herhangi bir çözüm bulamıyorum. Birisi neyi yanlış yaptığımı ve düzeltmek için ne yapabileceğimi gösterebilir?

Custom AuthenticationProvider'ımın kodu:

@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);
    }

}

Varlık sınıflarım:

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;
    }
}

Tam proje github'da mevcut

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


Yetkililerinizi hevesle toplayın veya bir OpenSessionInViewFilter kullanın.
Bart

tam olarak nasıl yapılacağına bakmaya çalışıyorum. Denediğim şey şuydu: <Autorizacoes> otorite = user.getAutorizacoes () 'i , UsernamePasswordAuthenticationToken atamasından aynı işlevin içinde listeleyin , ancak yine de çalışmıyor.
Kleber Mota

2
@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
Bart 14

Tamam, deniyorum ama yine de çalışmıyor. Varlık sınıfım güncellendi: github.com/klebermo/webapp_horario_livre/blob/master/src/com/… , Mevcut AuthenticationProvider'ım: github.com/klebermo/webapp_horario_livre/blob/master/src/com/…
Kleber Mota

Yanıtlar:


135

fetch=FetchType.EAGERAlt varlıkları otomatik olarak geri çekmek için ManyToMany ek açıklamalarınızın içine eklemeniz gerekir :

@ManyToMany(fetch = FetchType.EAGER)

Yay yapılandırma dosyanıza aşağıdakileri ekleyerek yaylı bir transactionManager uygulamak daha iyi bir seçenek olacaktır:

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

<tx:annotation-driven />

Daha sonra kimlik doğrulama yönteminize bir @Transactional ek açıklaması ekleyebilirsiniz:

@Transactional
public Authentication authenticate(Authentication authentication)

Bu, daha sonra kimlik doğrulama yönteminin süresi boyunca bir db işlemi başlatarak herhangi bir tembel koleksiyonun, bunları kullanmayı denediğinizde veritabanından alınmasına izin verir.


1
Aslında, uygulamamda transactionManager yapılandırılmış ve bunu DAO sınıflarımda kullanıyorum. AuthenticationProvider'dan önerdiğiniz gibi kimlik doğrulama yönteminde kullanmayı denersem, neden olduğu bir hata alıyorum : java.lang.IllegalArgumentException: com.horariolivre.security.CustomAuthenticationProvider alanı com.horariolivre.security.SecurityConfig.authenticationProvider olarak $ Proxy36 olarak ayarlanamıyor . ManyToMany ek açıklamamın içinde fetchType = FetchType.EAGER add kullanırsam da aynı hatayı alıyorum (ve bunu yalnızca bir atribute'da kullanabilirim - Entity sınıfım Usuario'da aynı türden üç tane var).
Kleber Mota

3
LazyInitializationException'dan kaçınmak için bir Transaction içinde kullanmak istediğiniz alt varlıkları yürütmeniz gerekir. İşlem ek açıklamanız genel bir yöntemde dao düzeyinde olduğundan, muhtemelen bunu orada yapmak istemeyeceksiniz, bu nedenle dao'nun önünde, içinden yürüyebileceğiniz @Transactional sınırları olan bir hizmet sınıfı uygulamanız gerekecektir. istenen alt varlıklar
jcmwright80

Gelecekte bununla karşılaşan biri için protip; @Transaction halka açık bir yöntemde olmalıdır. Değilse, bu işe yaramayacaktır. Herhangi bir uyarı olabilir veya olmayabilir.
Nicolas

getirme türünü kullandı ve mükemmel çalıştı, @transaksiyonel sayaç kısmına istekli getirmeyi kullanmanın
farkını sorgulayın

34

Yönergeyi işlemenin en iyi yoluLazyInitializationExceptionJOIN FETCH , getirmeniz gereken tüm varlıklar için yönergeyi kullanmaktır .

Her neyse, yanıtlardan bazılarının önerdiği şekilde aşağıdaki Anti-Kalıpları KULLANMAYIN:

Bazen, bir DTO projeksiyonu varlıkları almaktan daha iyi bir seçimdir ve bu şekilde hiçbir şey elde edemezsiniz LazyInitializationException.


1
birleştirme getirme, istekli getirmeye eşdeğerdir. Bu her zaman uygulanabilir veya verimli olmayabilir. Ayrıca nesneyi almanın olağan yolu jpql sorguları aracılığıyla değildir. Açık oturumun görüşün bir anti-model olduğu gerçeği uzun bir atış ve dürüst olmak gerekirse, katılmıyorum. Açıkçası dikkatli kullanılmalıdır, ancak bundan fayda sağlayan çok sayıda mükemmel iyi kullanım durumu vardır.
fer.marino

4
Hayır, DEĞİL . Görünümde Açık Oturum hack ve varlıkların salt okunur projeksiyonlar için bile getirildiğini gösteren bir işarettir. Ne kadar meşrulaştırmaya çalışsanız da , bundan fayda sağlayan mükemmel derecede iyi kullanım örnekleri diye bir şey yoktur. Gerçekte ihtiyacınız olandan daha fazla veri almak için hiçbir mazeret yoktur ve işlem hizmet katmanının sınırları dışına veri getirme konusunda hiçbir mazeret yoktur.
Vlad Mihalcea

HI Vlad, FETCH JOIN'in neden istekli yüklemeye eşdeğer olmadığını açıklar mısınız? Bu makalenin üzerinden geçiyorum : blog.arnoldgalovics.com/2017/02/27/… . Ve "Daha iyi bir fikir, ilişkiyi ana - Şirket - varlığını yüklerken yüklemektir. Bu bir Getir Katılmayla yapılabilir" diyor. Bu yüzden hevesli bir yükleme. Değil mi?
Geek

1
Hevesli liderlik FetchType.EAGER, derneklerinize katkıda bulunmak demektir . JOIN FETCH, FetchType.LAZYsorgu zamanında hevesle getirilmesi gereken ilişkilendirmeler içindir.
Vlad Mihalcea

25

Kalıcılık.xml dosyanıza aşağıdaki özelliği eklemek sorununuzu geçici olarak çözebilir

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

@ Vlad-mihalcea bunun bir anti-model olduğunu ve tembel başlatma sorununu tamamen çözmediğini söylediği gibi, işlemi kapatmadan önce ilişkilendirmelerinizi başlatın ve bunun yerine DTO'ları kullanın.


16

Birim Testi yaparken ben de bu sorunu yaşadım. Bu soruna çok basit bir çözüm , oturumu yürütmenin sonuna kadar açık tutan @Transactional annotation kullanmaktır .


Hibernate Transational veya JPA Transactional kullanıyor musunuz?
jDub9

1
Hibernate'i kullandım
KarthikaSrinivasan

11

Bunun nedeni, tembel yükleme kullandığınızda oturumun kapanmasıdır.

İki çözüm var.

  1. Tembel yükleme kullanmayın.

    Set lazy=falseXML veya Set içinde @OneToMany(fetch = FetchType.EAGER)de ek açıklama.

  2. Tembel yük kullanın.

    Set lazy=trueXML veya Set içinde @OneToMany(fetch = FetchType.LAZY)de ek açıklama.

    ve ekleme OpenSessionInViewFilter filterde seninweb.xml

Detay Yazıma bakın.

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


1
OpenSessionInViewFilter ayrıca bir anti-modeldir. Ayrıca, EAGER koleksiyonunda bu verilere ihtiyaç duymadığınız birçok durum olacağından ve bu kullanım durumlarının ihtiyaç duyduğundan daha fazla veri çekeceğiniz ve performansınızı büyük ölçüde azaltacağınız için, EAGER'a asla bir eşleme ayarlamanızı da önermiyorum. Lütfen tüm eşlemeleri LAZY olarak tutun ve bunun yerine Sorgularınıza birleştirme getirmeleri ekleyin.
user1567291

6

Hazırda bekletme tembel başlatıcıyı kullanabilirsiniz.

Aşağıda başvurabileceğiniz kod bulunmaktadır.
İşte PPIDOalmak istediğim veri nesnesi

Hibernate.initialize(ppiDO);
if (ppiDO instanceof HibernateProxy) {
    ppiDO = (PolicyProductInsuredDO) ((HibernateProxy) ppiDO).getHibernateLazyInitializer()
        .getImplementation();
    ppiDO.setParentGuidObj(policyDO.getBasePlan());
    saveppiDO.add(ppiDO);
    proxyFl = true;
}

6

Custom AuthenticationProvider sınıfınıza aşağıdaki bilgiler eklenmelidir:

@Transactional

Bu, orada da hazırda bekletme oturumunun varlığından emin olmanızı sağlayacaktır.


4

Numaralandırma koleksiyonuyla ilgili bu sorunu yaşayanlar için, işte nasıl çözüleceği:

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

Bu benim için çalışıyor. Ayrıca @Transactional ekleme seçeneğini de test ettim ve aynı zamanda çalışıyor. Ama bu seçeneği seçiyorum.
rick dana

2

Öncelikle tembellikten ve işlemlerden söz eden tüm kullanıcıların haklı olduğunu söylemek isterim. Ama benim durumumda bir testte @Transactional yönteminin sonucunu kullanmamda ve bu gerçek işlemin dışında küçük bir fark vardı, bu yüzden bu tembel istisnayı aldım.

Hizmet yöntemim:

@Transactional
User get(String uid) {};

Test kodum:

User user = userService.get("123");
user.getActors(); //org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

Benim çözümüm, bu kodu şu şekilde başka bir işlemle sarmalamaktı:

List<Actor> actors = new ArrayList<>();
transactionTemplate.execute((status) 
 -> actors.addAll(userService.get("123").getActors()));

1

İnanıyorum ki istekli getirmeyi sağlamak yerine, LazyInitializationExceptionistisnadan kaçınmak için gerekli olduğu yerde varlığınızı yeniden başlatmanın mantıklı olduğuna inanıyorum.

Hibernate.initialize(your entity);

0

JaVers kullananlar için , denetlenmiş bir varlık sınıfı verildiğinde , istisnaya neden olan özellikleri göz ardı etmek isteyebilirsiniz LazyInitializationException(örn @DiffIgnore. Ek açıklamayı kullanarak ).

Bu, çerçeveye nesne farklılıklarını hesaplarken bu özellikleri göz ardı etmesini söyler, böylece işlem kapsamı dışındaki ilgili nesneleri DB'den okumaya çalışmaz (böylece istisnaya neden olur).


0

Yaygın bir uygulama, @Transactionalhizmet sınıfınızın üstüne koymaktır .

@Service
@Transactional
public class MyServiceImpl implements MyService{
...
}

-1

Ek açıklamayı ekleyin

@JsonManagedReference

Örneğin:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "autorizacoes_usuario", joinColumns = { @JoinColumn(name = "fk_usuario") }, inverseJoinColumns = { @JoinColumn(name = "fk_autorizacoes") })
@JsonManagedReference
public List<AutorizacoesUsuario> getAutorizacoes() {
    return this.autorizacoes;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.