/ / A consulta JDBC não vê modificações de session.flush na mesma transação - java, hibernate, spring-orm

Consulta JDBC não vê modificações session.flush na mesma transação - java, hibernate, spring-orm

Tenho um projeto com Spring e Hibernate.

Depois de uma inserção feita com o hibernate não consigo ver os dados no sql jdbc, mesmo que eu tenha chamado o método session.flush. Alguma idéia de por que isso está acontecendo?

Minha configuração é assim:

 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="packagesToScan">
<list>
<value>ro.asf.capone.common.model</value>
</list>
</property>
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${agency.hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${agency.hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${agency.hibernate.format_sql}</prop>
<prop key="hibernate.jdbc.batch_size">100</prop>
<prop key="hibernate.jdbc.batch_versioned_data">true</prop>
<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</prop>
</props>
</property>
<property name="entityInterceptor" ref="auditInterceptor" />
</bean>

Eu também tentei <prop key="hibernate.connection.autocommit">false</prop> com o mesmo resultado.

A fonte de dados é hiraki ds, mas tentei o Bonecp com o mesmo resultado.

@Bean
public DataSource dataSource() {
final HikariDataSource dataSource = new HikariDataSource();
//     dataSource.setAutoCommit(false);
dataSource.setDriverClassName(jdbcDriver);
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUsername(jdbcUsername);
dataSource.setPassword(jdbcPassword);
dataSource.setIdleTimeout(60000);
dataSource.setMinimumIdle(0);
dataSource.setMaximumPoolSize(2);
return dataSource;
}

O código que estou usando é:

 final AuditUsers typ = new AuditUsers();
typ.setEntityId(1l);
typ.setLevel(29);
final Serializable typid = getSession().save(typ);
System.out.println(">>>>>>>>>>>>>> id: " + typid);
getSession().flush();
getSession().clear();
final String sqltyp = "select * from AUDIT_USERS where id = " + typid;

try(Connection con = getConnection(); Statement stm = con.createStatement()){
System.out.println("!!!" + con.getAutoCommit());
final ResultSet rs = stm.executeQuery(sqltyp);
while(rs.next()){
System.out.println("RS filename: " + rs.getString("ENTITY_ID"));
}
}catch (final Exception e) {
e.printStackTrace();
}

E eu não obtenho o próximo valor de rs.

Se eu usar o método doWork, o conjunto de resultados terá valores, mas não quero usá-lo dessa forma.

                getSession().doWork(new Work() {

@Override
public void execute(final Connection connection) throws SQLException {
final Statement stm = connection.createStatement();
final ResultSet rs = stm.executeQuery(sqltyp);
while(rs.next()){
System.out.println("RS filename: " + rs.getString("ENTITY_ID"));
}
}
});

Eu tenho uma classe HibernateDAOSupport para definir a fonte de dados de acesso e a sessionfactory que são definidas a partir do xml de configuração do spring:

public abstract class HibernateDAOSupport {

private SessionFactory sessionFactory;

private DataSource dataSource;


public SessionFactory getSessionFactory() {
return sessionFactory;
}

public void setSessionFactory(final SessionFactory sessionFactory)    {
this.sessionFactory = sessionFactory;
}

public DataSource getDataSource() {
return dataSource;
}

public void setDataSource(final DataSource dataSource) {
this.dataSource = dataSource;
}

public void setDs(final DataSource dataSource) {
this.dataSource = dataSource;
}

public Session getSession() {
return sessionFactory.getCurrentSession();
}

public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}

E o xml:

 <bean id="hibernateDAO" class="ro.asf.capone.server.dao.HibernateDAOSupport" abstract="true">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="dataSource" />
</bean>

Respostas:

0 para resposta № 1

Eu encontrei uma solução para isso mudando o getConnection implementação em HibernateDAOSupport classe com isso:

public Connection getConnection(){
return org.springframework.jdbc.datasource.DataSourceUtils.getConnection(dataSource);
}

Obrigado M. Deinum por apontar que uma nova conexão é oferecida a partir da fonte de dados e não a mesma é usada. Tive a impressão de que uma única conexão abrange uma transação.