Ahmad.Masood
Ahmad.Masood

Reputation: 1309

Unable to solve error "save is not valid without active transaction"

I'm unable to solve error

save is not valid without active transaction

my code:

public class PersistenceJPAConfig {

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] { "self.experiment.dto" });

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());
    return em;
}

@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
    return hemf.getSessionFactory();
}

@Bean
public EntityManager entityManager(){
    return entityManagerFactory().getObject().createEntityManager();
}

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    return dataSource;
}

@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
    HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
    hibernateTransactionManager.setSessionFactory(sessionFactory);
    return hibernateTransactionManager;
}

Properties additionalProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
    properties.setProperty("hibernate.current_session_context_class", "thread");
    properties.setProperty("hibernate.show_sql", "false");
    return properties;
}
}

public class UserBL {

@Autowired
UserDAO userDao;

@Transactional(transactionManager="transactionManager")
public void saveUsers(){
    User user = new User();
    user.setName("Bob");
    userDao.insert(user);
}
}

On a lot of blogs i have read that removing hibernate.current_session_context_class from JPA property will fix this problem. But when i remove it i get following error

No CurrentSessionContext configured!

Upvotes: 0

Views: 64

Answers (1)

Alan Hay
Alan Hay

Reputation: 23226

You are configuring a SessionFactory and an EntityManagerFactory. Remove all the Hibernate specific stuff:

@Configuration
public class PersistenceJPAConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[] { "self.experiment.dto" });

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        return dataSource;
    }

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

        return transactionManager;
    }

    Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.setProperty("hibernate.show_sql", "false");
        return properties;
    }
}

Service

public class UserBL {

@Autowired
UserDAO userDao;

@Transactional
public void saveUsers(){
    User user = new User();
    user.setName("Bob");

    userDao.insert(user);
}
}

DAO

public class UserDAO {
    @PersistenceContext
    private EntityManager em;
}

Upvotes: 1

Related Questions