From Spring Framework Version 5.2 whenever a method is marked @Transactional(readOnly=true) I should be expecting:
Session.setDefaultReadOnly(true)
.- flushMode is set to MANUAL/NEVER but not COMMIT( as per this post and this answer).
However when I am trying with readOnly=true both of the above conditions are not as it is expected.
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig {
@Bean
@Primary
DataSource dataSource() throws PropertyVetoException {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/db_example");
config.setDriverClassName(Driver.class.getName());
config.setConnectionTestQuery("SELECT 1");
config.setUsername("root");
config.setPassword("root1234");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.addDataSourceProperty("useServerPrepStmts", "true");
config.setMaximumPoolSize(11);
return new HikariDataSource(config);
}
@Bean
@Primary
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.example.hibernatedemo");
factory.setDataSource(dataSource());
Properties properties = new Properties();
properties.setProperty("hibernate.generate_statistics", "true");
factory.setJpaProperties(properties);
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
PlatformTransactionManager transactionManager() throws PropertyVetoException {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
txManager.setDataSource(dataSource());
return txManager;
}
}
@Service
public class PostService {
.
.
.
@Transactional(readOnly = true)
public List<Post> getByTitles(List<String> titles) {
List<Post> posts = postDao.getByTitle(titles);
System.out.println(entityManager.getFlushMode());
Session session = (Session) entityManager.getDelegate();
System.out.println(session.isDefaultReadOnly());
printLoadedState(posts);
return posts;
}
}
@Repository
public class PostDao {
.
.
.
public List<Post> getByTitle(List<String> titles) {
Session session = (Session) entityManager.getDelegate();
return session.createQuery("select p from Post p where title IN :titles", Post.class)
.setParameter("titles", titles).getResultList();
}
}
Here are the logs:
[2019-11-25 18:37:30] [http-nio-8091-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager.getTransaction - [ ] Creating new transaction with name [com.example.hibernatedemo.service.PostService.getByTitles]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
[2019-11-25 18:37:30] [http-nio-8091-exec-2] DEBUG o.s.jdbc.datasource.DataSourceUtils.prepareConnectionForTransaction - [ ] Setting JDBC Connection [HikariProxyConnection@676721780 wrapping com.mysql.cj.jdbc.ConnectionImpl@66522ead] read-only
[2019-11-25 18:37:30] [http-nio-8091-exec-2] DEBUG o.h.e.t.internal.TransactionImpl.<init> - [ ] On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false
[2019-11-25 18:37:30] [http-nio-8091-exec-2] DEBUG o.h.e.t.internal.TransactionImpl.begin - [ ] begin
.
.
.
flushMode: COMMIT
readOnly: false
.
.
.
[2019-11-25 18:37:33] [http-nio-8091-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager.processCommit - [ ] Initiating transaction commit
[2019-11-25 18:37:33] [http-nio-8091-exec-2] DEBUG o.s.orm.jpa.JpaTransactionManager.doCommit - [ ] Committing JPA transaction on EntityManager [SessionImpl(1945987926<open>)]
[2019-11-25 18:37:33] [http-nio-8091-exec-2] DEBUG o.h.e.t.internal.TransactionImpl.commit - [ ] committing
[2019-11-25 18:37:33] [http-nio-8091-exec-2] DEBUG o.s.jdbc.datasource.DataSourceUtils.resetConnectionAfterTransaction - [ ] Resetting read-only flag of JDBC Connection [HikariProxyConnection@676721780 wrapping com.mysql.cj.jdbc.ConnectionImpl@66522ead]
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Please add comment if anymore information is needed. I may be missing out on a basic config or something. Any help is appreciated.