How do I leave a JPA transaction with Spring open?

Asked

Viewed 150 times

-2

I would like to know how to leave a JPA transaction with spring open, today I use the annotation @Transaction what happens is that every time I want to carry some attribute that is not like EAGER generates NullPointerException, the solution I had in the old days was to leave the transaction open, so where I needed the object that was still NULL, when I was giving a get In this object he searched for me without problems. In case you don’t know how to work with open transactions, someone has a solution for me how to use LAZY load with Spring MVC and let him manage my transactions when I need them?

My method at the DAO:

    @Transactional(readOnly = true)
        public Locador buscarElemento(int id) throws IdentificadorNaoExisteNaBaseDeDadosException {
            try {
                Locador locador = manager.find(Locador.class, id);
   /*
   *  Retirando os comentarios abaixo funciona, mas não é uma boa pratica,
   *  por que vai ter o mesmo comportamente do EAGER.
   */

    //          locador.getContatos().forEach(contato -> contato.getEmail());
    //          locador.getDocumentos().getCpf();
    //          locador.getEnderecos().forEach(endereco -> endereco.getBairro());*
                return locador;
            } catch (Exception e) {
                LOGGER.error(e.getMessage(), e);
                throw new IdentificadorNaoExisteNaBaseDeDadosException(e);
            }
        }

The generated Exception when I try to recover all attributes of the object :

Hibernate: select locador0_.id as id1_3_0_, locador0_.codigo as codigo2_3_0_, locador0_.dataNascimento as dataNasc3_3_0_, locador0_.documentos_id as document6_3_0_, locador0_.nome as nome4_3_0_, locador0_.observacao as observac5_3_0_ from Locador locador0_ where locador0_.id=?
    abr 30, 2019 6:38:32 PM org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/SistemaGestaoImobiliario] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: could not initialize proxy - no Session] with root cause
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
        at org.hibernate.Hibernate.getClass(Hibernate.java:111)
        at adapters.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:49)
        at adapters.HibernateProxyTypeAdapter.write(HibernateProxyTypeAdapter.java:19)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
        at com.google.gson.Gson.toJson(Gson.java:704)
        at com.google.gson.Gson.toJson(Gson.java:683)
        at com.google.gson.Gson.toJson(Gson.java:638)
        at com.google.gson.Gson.toJson(Gson.java:618)
        at services.GoogleJSONService.gerarJSON(GoogleJSONService.java:14)
        at control.LocadorController.carregarLocador(LocadorController.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
  • 2

    A full capital title is a stylistic sin. It seems that you are trying to draw attention to the cry, not the content

  • 1

    Taking advantage, what is EAGUE?

  • 2

    Put here your code and also the error stack. Try to formulate your question well, inserting the codes and facilitating the life of those who are here willing to help you.

  • @Filipel.Constant already edited the post, see if you can help me please ! ate more !

1 answer

0


I found the solution to my problem, missing a property to be configured.

My JPA configuration file

package config;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {"exceptions", "dao"})
public class JPAConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() {

        LocalContainerEntityManagerFactoryBean manager = new LocalContainerEntityManagerFactoryBean();

        // mapeia o provedor
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        // configura o data source, configurações sobre o banco de dados
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        dataSource.setUrl("jdbc:mysql://localhost:3306/imobiliaria?useTimezone=true&serverTimezone=UTC");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");


        // propriedades do jpa
        Properties props = new Properties();
        props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        props.setProperty("hibernate.show_sql", "true");
//      props.setProperty("hibernate.format_sql", "true");
        props.setProperty("hibernate.hbm2ddl.auto", "update");
        props.setProperty("hibernate.enable_lazy_load_no_trans", "true");

        manager.setPackagesToScan("model");
        manager.setDataSource(dataSource);
        manager.setJpaProperties(props);
        manager.setJpaVendorAdapter(vendorAdapter);

        return manager;

    }

    @Bean
    public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager manager = new JpaTransactionManager(emf);
        return manager;
    }

}

In my Jpaconfig I was forgetting the property :

props.setProperty("hibernate.enable_lazy_load_no_trans", "true");

So Hibernate opens the connection automatically whenever it needs to fetch a Lazy Load object.

See you around !!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.