2016-09-03 17 views
0

Webアプリケーションでspring 4 & hibernate注釈を使用しています。すべてが単一のデータソースでうまく動作します。 2番目のデータソースを追加すると、現在のスレッドエラーのセッションがありません。複数のデータソース(hibernate注釈スロー中)現在のスレッドエラーでセッションが見つかりません

ここにコードがあります。

public abstract class PortalAbstractDao<PK extends Serializable, T> { 

private final Class<T> persistentClass; 

@SuppressWarnings("unchecked") 
public PortalAbstractDao() { 
    this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()) 
      .getActualTypeArguments()[1]; 
} 

@Autowired 
@Qualifier("eportalSessionFactory") 
private SessionFactory sessionFactory; 

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

@SuppressWarnings("unchecked") 
public T getByKey(PK key) { 
    return (T) getSession().get(persistentClass, key); 
} 

public void persist(T entity) { 
    getSession().persist(entity); 
} 

public void delete(T entity) { 
    getSession().delete(entity); 
} 

protected Criteria createEntityCriteria() { 
    return getSession().createCriteria(persistentClass); 
} 

}

DAO実装

@Repository("portalDao") 
public class PortalDaoImpl extends PortalAbstractDao<Integer, PortalAsset> implements PortalDao { 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<PortalAsset> findAllAssets() { 
     //  Query query = getSession().createSQLQuery(
     //    "select id,CSC_ASSET_TAG,SERIAL_NO,IBM_ASSET_TAG from sgh_assets where CSC_ASSET_TAG like :term"); 
     //  query.setString("term", "%gwls1208%"); 
     Criteria criteria = getSession() 
       .createCriteria(PortalAsset.class) 
       .setMaxResults(20) 
       .setProjection(
         Projections.projectionList().add(Projections.property("id"), "id") 
           .add(Projections.property("ctcassettag"), "ctcassettag") 
           .add(Projections.property("serialno"), "serialno") 
           .add(Projections.property("ibmassettag"), "ibmassettag") 
           .add(Projections.property("block"), "block") 
           .add(Projections.property("level"), "level").add(Projections.property("room"), "room")) 
       .setResultTransformer(Transformers.aliasToBean(PortalAsset.class)); 
     return (List<PortalAsset>) criteria.list(); 
    } 
} 

Hibernate設定

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "com.span.vms.configuration" }) 
@PropertySource(value = { "classpath:application.properties" }) 
public class HibernateConfiguration { 

    @Autowired 
    private Environment environment; 

    @Bean 
    @Primary 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.span.vms.model" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    @Qualifier("eportalSessionFactory") 
    public LocalSessionFactoryBean eportalSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(eportalDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "org.ctc.pm.model" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
     return dataSource; 
    } 

    @Bean 
    public DataSource eportalDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.eportal.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.eportal.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.eportal.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     return properties; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager transactionManager(SessionFactory s) { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(s); 
     return txManager; 
    } 
} 

サービス実装

@Service("portalService") 
public class PortalServiceImpl implements PortalService { 
    @Autowired 
    private PortalDao dao; 

    @Override 
    public List<PortalAsset> findAllAssets() { 
     return dao.findAllAssets(); 
    } 

} 

サービスインタフェース

public interface PortalDao { 
    List<PortalAsset> findAllAssets(); 
} 

私は主データソースが正常に動作している現在のスレッド・エラーのためのセッションを取得していないのですList<PortalAsset> assets = portalService.findAllAssets();を実行します。私がした間違いは何ですか? @Transactional注釈で、それは...

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "com.span.vms.configuration" }) 
@PropertySource(value = { "classpath:application.properties" }) 
public class HibernateConfiguration { 

    @Autowired 
    private Environment environment; 

    @Bean 
    @Primary 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.span.vms.model" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean(name = "eportalSessionFactory") 
    public LocalSessionFactoryBean eportalSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(eportalDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "org.ctc.pm.model" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
     return dataSource; 
    } 

    @Bean 
    public DataSource eportalDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.eportal.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.eportal.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.eportal.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     return properties; 
    } 

    @Bean(name = "txManager1") 
    public HibernateTransactionManager transactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(sessionFactory()); 
     return txManager; 
    } 

    @Bean(name = "txManager2") 
    public HibernateTransactionManager transactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(eportalSessionFactory()); 
     return txManager; 
    } 

とサービス層である必要があり、あなたのHibernate設定ファイル内

答えて

1

は、使用するトランザクションマネージャの名前を指定します。

+0

変更後に動作しない – Rajesh

+0

エラーが発生しましたか? –

+0

同じエラーが発生しました。現在のスレッドのセッションはありません。 (また、あなたの情報のために私はそれが正常に動作している一次注釈付きの別のデータソースを持っています) – Rajesh

関連する問題