হাইবারনেট অলস ইনিটায়ালাইজেশন এক্সেক্সপশন কীভাবে ঠিক করবেন: অলসভাবে ভূমিকা সংকলন আরম্ভ করতে ব্যর্থ, প্রক্সি আরম্ভ করতে পারেনি - কোন সেশন নেই


103

আমার বসন্ত প্রকল্পের কাস্টম প্রমাণীকরণের সরবরাহকারীতে, আমি লগড ব্যবহারকারীর কর্তৃপক্ষের তালিকাটি পড়ার চেষ্টা করছি, তবে আমি নিম্নলিখিত ত্রুটির মুখোমুখি হয়েছি:

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)

স্ট্যাকওভারফ্লোতে এখান থেকে অন্যান্য বিষয়গুলি পড়া, আমি বুঝতে পারি যে ফ্রেমওয়ার্ক দ্বারা এই ধরণের অ্যাট্রিবিউট পরিচালনা করা হয়, তবে আমি আমার মামলার কোনও সমাধান বের করতে পারি না। কেউ বলতে পারে যে আমি কী ভুল করছি এবং এটি সংশোধন করার জন্য আমি কী করতে পারি?

আমার কাস্টম প্রমাণীকরণের সরবরাহকারীর কোডটি হ'ল:

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

}

আমার সত্তা ক্লাস হয়:

ইউসারিওহোম.জভা

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

অটোরিজাকোসুয়েরিও.জভা

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

}

অটোরিজাকোস.জভা

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

গিথুবে সম্পূর্ণ প্রকল্প উপলব্ধ

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


আপনার কর্তৃপক্ষকে অধীর আগ্রহে আনুন বা একটি ওপেনসেশনআইভিউ ফিল্টার ব্যবহার করুন।
বার্ট

এটি হ'ল আমি কীভাবে করব তা দেখার চেষ্টা করছি। আমি যা চেষ্টা করেছি তা হ'ল: ইউজারনেম পাসওয়ার্ডআউটেন্টিফিকেশন টোকেন বরাদ্দকরণ থেকে একই ফাংশনের ভিতরে <অটোরিজাকোস> কর্তৃপক্ষ = ব্যবহারকারীর ক্ষেত্রের অটোরিজাকোস () তালিকাবদ্ধ করুন , কিন্তু এখনও কাজ করে না।
ক্লেবার মোটা

4
@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
বার্ট

ঠিক আছে, আমি চেষ্টা করেছিলাম, কিন্তু এখনও কাজ করে না। আমার সত্তা শ্রেণি আপডেট হয়েছে: github.com/klebermo/webapp_horario_livre/blob/master/src/com/… , আমার বর্তমান প্রমাণীকরণপ্রদানকারী: github.com/klebermo/webapp_horario_livre/blob/master/src/com/…
মোটা

উত্তর:


134

হয় আপনি যোগ করতে হবে fetch=FetchType.EAGERসব অ্যাপলিকেশনগুলি শিশু সত্ত্বা টান আপনার ManyToMany টীকা ভিতরে:

@ManyToMany(fetch = FetchType.EAGER)

আপনার বসন্তের কনফিগারেশন ফাইলে নিম্নলিখিতটি যুক্ত করে একটি বসন্তের ট্রানজিশন ম্যানেজার প্রয়োগ করা আরও ভাল বিকল্প হবে:

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

<tx:annotation-driven />

তারপরে আপনি নিজের অনুমোদন পদ্ধতিতে @ ট্রান্সজেকশনাল টিকাটি যুক্ত করতে পারেন:

@Transactional
public Authentication authenticate(Authentication authentication)

এরপরে কোনও অলস সংগ্রহ ডিবি থেকে এবং যখন আপনি সেগুলি ব্যবহার করার চেষ্টা করবেন তখন কোনও অলস সংগ্রহ পুনরুদ্ধার করার অনুমতি দেওয়ার অনুমোদনের পদ্ধতির সময়কালের জন্য এটি একটি ডিবি লেনদেন শুরু করবে।


4
আসলে, আমি আমার অ্যাপ্লিকেশনটিতে লেনদেনের ব্যবস্থাপনারটি কনফিগার করেছি এবং আমি এটি আমার ডিএও ক্লাসে ব্যবহার করি। যদি আপনি প্রস্তাবিত প্রমাণীকরণের সরবরাহকারীর থেকে প্রমাণীকরণ পদ্ধতিটিতে আমি যদি চেষ্টা করার চেষ্টা করি তবে আমি একটি ত্রুটি পেয়েছি যার দ্বারা: java.lang.IllegalArgumentEception: com.horariolivre.security.CustomAuthenticationProdider ক্ষেত্র com.horariolivre.security.SecurityConfig.autheication । আমি যদি আমার ম্যান্টিটোমনি টীকাতে অ্যাড ফেচটাইপ = ফেচটাইপ যোগ করি তবে আমি একই ত্রুটি পেয়েছি (এবং আমি এটি কেবলমাত্র একটি অঙ্কে ব্যবহার করতে পারি - আমার সত্তা ক্লাস উসারিওতে একই ধরণের তিনটি রয়েছে)।
ক্লেবার মোটা

4
LazyInitializationException এড়ানোর জন্য আপনার যে শিশু সত্তা কোনও লেনদেনের মধ্যে ব্যবহার করতে চান সেগুলি চলতে হবে। যেহেতু আপনার লেনদেনের টীকাটি জেনেরিক পদ্ধতিতে দাও স্তরে রয়েছে আপনি সম্ভবত এটি করতে চাইবেন না তাই আপনাকে দাওর সামনে একটি পরিষেবা শ্রেণি প্রয়োগ করতে হবে যা @ ট্রান্সজেকশনাল সীমানা রয়েছে যার মধ্য দিয়ে আপনি চলতে পারেন পছন্দসই শিশু সত্তা
jcmwright80

ভবিষ্যতের জন্য এটির মুখোমুখি কারও জন্য প্রতিরোধ করুন; @ লেনদেনের প্রকাশ্য পদ্ধতিতে হওয়া দরকার। যদি তা না হয় তবে এটি কাজ করবে না। কোনও সতর্কতা থাকতে পারে বা নাও থাকতে পারে।
নিকোলাস

আনার ধরণটি ব্যবহার করা হয়েছে এবং এটি পুরোপুরি কাজ করেছে, প্রশ্ন করুন @ ট্রান্সএশনাল কাউন্টার অংশে আগ্রহী আনতে কী পার্থক্য রয়েছে
অস্টাইন

33

হ্যান্ডেল করার সর্বোত্তম উপায়LazyInitializationException হ'ল আপনার JOIN FETCHযে সমস্ত সত্তা বয়ে আনতে হবে তার জন্য নির্দেশিকা ব্যবহার করা।

যাইহোক, উত্তরগুলির কয়েকটি হিসাবে প্রস্তাবিত নীচের অ্যান্টি-প্যাটার্নগুলি ব্যবহার করবেন না:

কখনও কখনও, একটি ডিটিও অভিক্ষেপ সত্তা আনার চেয়ে ভাল পছন্দ এবং এইভাবে, আপনি কোনও পাবেন না LazyInitializationException


4
আনতে যোগ দেওয়া আগ্রহী আনার সমতুল্য। যা সর্বদা সম্ভব এবং কার্যকর নাও হতে পারে। এছাড়াও অবজেক্টের আনার স্বাভাবিক উপায়টি jpql কোয়েরির মাধ্যমে নয়। খোলার অধিবেশনটি এন্টিপ্যাটার্ন হিসাবে দেখার বিষয়টি একটি দীর্ঘ শট, এবং সত্যই, আমি একমত নই। এটি অবশ্যই সাবধানতার সাথে ব্যবহার করা হবে, তবে অনেকগুলি নিখুঁত ব্যবহারের কেস রয়েছে যা এর থেকে উপকৃত হয়।
fer.marino

4
না, না । ভিউতে ওপেন সেশন হ্যাক এবং এটি কেবলমাত্র অনুমানের পড়ার জন্য সত্তা প্রাপ্ত করা হয়েছে এমন একটি চিহ্ন। আপনি একেবারে ন্যায়সঙ্গত করার জন্য যতই চেষ্টা করবেন না কেন, এর থেকে উপকার পাওয়া অনেকগুলি নিখুঁত সূক্ষ্ম ব্যবহারের মতো ঘটনা নেই। আপনার সত্যিকারের চেয়ে বেশি ডেটা আনার কোনও অজুহাত নেই , তেমনি লেনদেনের পরিষেবা স্তরের সীমানার বাইরে ডেটা আনার জন্য কোনও অজুহাত নেই।
ভ্লাদ মিহলসিয়া

এইচআই ভ্লাদ, আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন ফেচ জয়েন আগ্রহী লোডিংয়ের সমতুল্য নয়। আমি এই নিবন্ধটি দিয়ে যাচ্ছি: blog.arnoldgalovics.com/2017/02/27/… । এবং এটিতে বলা হয় "আপনি পিতামাতার - সংস্থা - সত্তাটি লোড করার সময় সম্পর্কটি লোড করা আরও ভাল ধারণা। এটি একটি আনতে যোগদানের মাধ্যমে করা যেতে পারে"। সুতরাং এটি একটি উত্সাহী লোড হয়। তাই না?
গীক

4
আগ্রহী নেতৃত্বের অর্থ FetchType.EAGERআপনার সমিতিগুলিতে যোগ করা। যোগদান FETCH হল এমন FetchType.LAZYসংঘের জন্য যেগুলি ক্যোরি -টাইমে আগ্রহের সাথে আনতে হবে।
ভ্লাদ মিহলছিয়া

25

আপনার অধ্যবসায়। Xml এ নিম্নলিখিত সম্পত্তি যুক্ত করা আপনার সমস্যাটি অস্থায়ীভাবে সমাধান করতে পারে

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

@ ভ্লাদ-মিহালসিয়া যেমন বলেছিল এটি একটি অ্যান্টিপ্যাটার্ন এবং এটি অলস সূচনা ইস্যুটি পুরোপুরি সমাধান করে না, লেনদেন বন্ধ করার আগে আপনার সমিতিগুলিকে আরম্ভ করুন এবং পরিবর্তে ডিটিও ব্যবহার করুন।


16

ইউনিট টেস্টিং করার সময় আমারও এই সমস্যা হয়েছিল। এই সমস্যার একটি খুব সহজ সমাধান হ'ল @ ট্রান্সজেকশনাল টিকাটি ব্যবহার করা যা কার্য সম্পাদন শেষ না হওয়া অবধি সেশনটিকে উন্মুক্ত রাখে।


আপনি কি হাইবারনেট ট্রানজেশনাল বা জেপিএ ট্রানজেকশনাল ব্যবহার করছেন?
jDub9

4
আমি হাইবারনেট
কার্তিকাশ্রিনিবাসন

11

কারণ হ'ল আপনি যখন অলস লোড ব্যবহার করেন তখন সেশনটি বন্ধ হয়ে যায়।

দুটি সমাধান আছে।

  1. অলস বোঝা ব্যবহার করবেন না।

    সেট lazy=falseXML বা সেটে @OneToMany(fetch = FetchType.EAGER)সালে টীকা।

  2. অলস বোঝা ব্যবহার করুন।

    সেট lazy=trueXML বা সেটে @OneToMany(fetch = FetchType.LAZY)সালে টীকা।

    এবং OpenSessionInViewFilter filterআপনার যোগ করুনweb.xml

বিস্তারিত আমার পোস্ট দেখুন।

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


4
ওপেনসেশনআইভিউ ফিল্টারটিও একটি অ্যান্টি-প্যাটার্ন। আমি আপনাকে ইগ্রারকে কখনই ম্যাপিং সেট না করার পরামর্শ দিচ্ছি কারণ অনেকগুলি ক্ষেত্রেই ইগ্রার সংগ্রহের ক্ষেত্রে আপনার সেই ডেটার প্রয়োজন হয় না এবং আপনি যেগুলি ব্যবহারের ক্ষেত্রে প্রয়োজন তার চেয়ে বেশি ডেটা টেনে নামাবেন এবং আপনার কার্য সম্পাদনকে হ্রাস করবেন। দয়া করে সমস্ত ম্যাপিংকে আলস্য করে রাখুন এবং পরিবর্তে আপনার ক্যোয়ারিতে যোগ দিন।
ব্যবহারকারী 1567291

6

আপনি হাইবারনেট অলস ইনিশিয়ালাইজার ব্যবহার করতে পারেন।

নীচে আপনি উল্লেখ করতে পারেন কোড।
এখানে PPIDOডেটা অবজেক্ট যা আমি পুনরুদ্ধার করতে চাই

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

6

আপনার কাস্টম প্রামাণিকতা প্রদানকারী সরবরাহকারী ক্লাসটি নিম্নলিখিত দিয়ে টীকায়িত করা উচিত:

@ লেনদেন

এটি সেখানে হাইবারনেট সেশনের উপস্থিতি নিশ্চিত করবে।


4

যারা এখানে সমস্যা সংগ্রহ করেন তাদের সমস্যাগুলি এখানে কীভাবে সমাধান করবেন:

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

এটি আমার পক্ষে কাজ করে। আমি @ ট্রান্সজেকশনাল যুক্ত করার বিকল্পটিও পরীক্ষা করেছিলাম এবং এটিও কার্যকর হয়। তবে আমি এই বিকল্পটি বেছে নিই।
রিক দানা

2

সবার আগে আমি বলতে চাই যে সমস্ত ব্যবহারকারী যারা অলসতা এবং লেনদেন সম্পর্কে বলেছেন তারা সঠিক ছিলেন। তবে আমার ক্ষেত্রে কিছুটা পার্থক্য ছিল যে আমি একটি পরীক্ষায় @ ট্রান্সঅ্যাকশনাল পদ্ধতির ফলাফল ব্যবহার করেছি এবং এটি বাস্তব লেনদেনের বাইরে ছিল তাই আমি এই অলস ব্যতিক্রমটি পেয়েছি।

আমার পরিষেবা পদ্ধতি:

@Transactional
User get(String uid) {};

আমার পরীক্ষার কোড:

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

আমার এটির সমাধানটি এই কোডটিকে অন্য কোনও লেনদেনে মোড়ানো ছিল:

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

1

আমি বিশ্বাস করি উত্সাহ আনতে সক্ষম করার পরিবর্তে, আপনার সত্তাকে পুনরায় সূচনা করার ক্ষেত্রে এটি বোধগম্য হবে যেখানে LazyInitializationExceptionব্যতিক্রম এড়াতে এটির প্রয়োজন

Hibernate.initialize(your entity);

0

নিরীক্ষিত সত্তা শ্রেণীর দেওয়া জ্যাভার্স ব্যবহারকারীদের জন্য , আপনি ব্যতিক্রমের কারণগুলির বৈশিষ্ট্যগুলি উপেক্ষা করতে চাইতে পারেন LazyInitializationException(যেমন @DiffIgnoreটীকাটি ব্যবহার করে )।

এটি অবজেক্টের পার্থক্যের গণনা করার সময় এই বৈশিষ্ট্যগুলিকে অগ্রাহ্য করার কাঠামোকে বলে, সুতরাং এটি লেনদেনের সুযোগের বাইরে সম্পর্কিত বিষয়গুলি ডিবি থেকে পড়ার চেষ্টা করবে না (ফলে ব্যতিক্রম ঘটায়)।


0

একটি সাধারণ অনুশীলন হল @Transactionalআপনার পরিষেবা শ্রেণীর উপরে class

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

-1

টীকা যুক্ত করুন

@JsonManagedReference

উদাহরণ স্বরূপ:

@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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.