org.springframework.orm.jpa.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke - PullRequest
0 голосов
/ 11 октября 2019

От выполнения запроса.

Исключение:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)

Вот мой класс конфигурации приложения, а также services class и DAO

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan("com.ghumapp");
    em.setJpaDialect(jpaDialect());
    em.setJpaVendorAdapter( jpaVendorAdapter());
    em.setJpaProperties(additionalProperties());
    return em;
}
@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl("Jdbc:mysql://localhost:3306/ghumapp?useSSL=false&serverTimezone=UTC");
    dataSource.setUsername("password");
    dataSource.setPassword("password");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    return dataSource;
}   
private JpaVendorAdapter jpaVendorAdapter() {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setDatabasePlatform(env.getProperty("jdbc.dialect"));
    return vendorAdapter;
}

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);

    return transactionManager;
}
private JpaDialect jpaDialect() {
    return new HibernateJpaDialect();
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

public Properties additionalProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.show_sql", "true");
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
    return properties;
}  

Вот мой Класс обслуживания:

@PostMapping("/persist")
public String persistuser(@RequestParam("password") String password,
        @RequestParam("userName") String userName, @RequestParam("firstName") String firstName,
        @RequestParam("lastName") String lastName, @RequestParam("email") String Email) {

    AppUser appUser = appUserDAO.geAppUserPersist(password, userName, firstName, lastName, Email );

    PersistenceService.persist(em, appUser);

    return "";
}

Вот мой DAO класс, который имеет @trasactional аннотацию, и я пробовал также с пружинной аннотацией trasactional

@Transactional
public AppUser geAppUserPersist(String password, String userName, String firstName, String lastName, String email ) {

     AppUser appUser = new AppUser();
     if(password != null)
         password = password.trim();

     appUser.setPassword(password);
     appUser.setUserName(userName);
     appUser.setFirstName(firstName);
     appUser.setLastName(lastName);
     appUser.setEmail(email);

     return appUser;
}
...