2015-12-07 3 views
1

У меня есть проект с Spring и Hibernate.JDBC-запрос не видит изменений session.flush в той же транзакции

После того, как вставка сделана в спящем режиме, я не могу видеть данные в sql sql, даже если бы я назвал метод session.flush. Любая идея, почему это происходит?

Моя конфигурация выглядит так:

<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> 

Я также попытался <prop key="hibernate.connection.autocommit">false</prop> с тем же результатом.

Источник данных hiraki ds, но я пробовал bonecp с тем же результатом.

@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; 
} 

код, который я использую:

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(); 
    } 

И я не получаю следующее значение РС-х.

Если я использую метод doWork, набор результатов имеет значения, но я не хочу использовать его так.

   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")); 
        } 
       } 
      }); 

У меня есть класс HibernateDAOSupport для установки с доступом источника данных и SessionFactory, которые установлены от конфигурации весной XML:

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(); 
    } 
} 

И в XML:

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

'getConnection' откроет новое соединение, которое является частью текущей транзакции и, следовательно, не видит изменений. Вместо использования простого соединения используйте 'JdbcTemplate', который будет использовать связанное с потоком соединение. –

+0

Я не могу найти JdbcTemplate в hibernate4. Именно по этой причине я создал класс HibernateDAOSupport. Но я проверю новое замечание о подключении. Спасибо –

+0

Я нашел JdbcTemplate в весенних классах. –

ответ

0

Я нашел решение для этого путем изменения реализации getConnection в классе HibernateDAOSupport следующим образом:

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

Спасибо M. Deinum за то, что вы указали, что новое соединение предлагается от источника данных, а не тот, который используется. У меня создалось впечатление, что одно соединение охватывает транзакцию.