Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数据源(多个DSs、Spring、Hibernate)以编程方式设置用户名/密码_Spring_Hibernate_Datasource_Credentials_Sessionfactory - Fatal编程技术网

在数据源(多个DSs、Spring、Hibernate)以编程方式设置用户名/密码

在数据源(多个DSs、Spring、Hibernate)以编程方式设置用户名/密码,spring,hibernate,datasource,credentials,sessionfactory,Spring,Hibernate,Datasource,Credentials,Sessionfactory,我正在使用Struts2、Spring和Hibernate开发一个多数据源web门户。我在将用户凭据设置到我的一个数据源时遇到问题,这些凭据在应用程序启动时不可用,但在用户登录时可用。它适用于第一个门户用户,但对后面的每个用户都失败 对于每个数据源,都会创建一个会话工厂,该工厂通过spring配置获取底层数据源集 我的四个数据源中有三个通过配置获得其数据库登录凭据集,但其中一个必须使用门户用户的凭据。注意,我的bean在会话范围内 以下是我的数据源配置: <!-- data source

我正在使用Struts2、Spring和Hibernate开发一个多数据源web门户。我在将用户凭据设置到我的一个数据源时遇到问题,这些凭据在应用程序启动时不可用,但在用户登录时可用。它适用于第一个门户用户,但对后面的每个用户都失败

对于每个数据源,都会创建一个会话工厂,该工厂通过spring配置获取底层数据源集

我的四个数据源中有三个通过配置获得其数据库登录凭据集,但其中一个必须使用门户用户的凭据。注意,我的bean在会话范围内

以下是我的数据源配置:

<!-- data source with credentials from configuration -->
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" scope="session">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<!-- data source that authenticates with user credentials from login. -->
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" scope="session">
    <property name="driverClassName" value="${ds2.jdbc.driverClassName}" />
    <property name="url" value="${ds2.jdbc.url}" />
</bean>
<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="session">
    <property name="dataSource">
        <ref bean="dataSource1" />
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            ...
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>hibernate/AnotherDTO.hbm.xml</value>
            ...
        </list>
    </property>
</bean>

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="session">
    <property name="dataSource">
        <ref bean="dataSource2" />
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            ...
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>hibernate/MyDTO.hbm.xml</value>
            ...
        </list>
    </property>
</bean>    
我的DAO将会话工厂插入到构造函数中,并将其传递给HibernateDaoSupport是的,我使用HibernateTemplate,请不要就此进行讨论;-:

public class MyDAO extends HibernateDaoSupport {
    @Autowired
    public MyDAO(@Qualifier("sessionFactory2") SessionFactory pSessionFactory) {
        setSessionFactory(pSessionFactory);
    }
    ...
}
现在,对于第一个使用门户的用户来说,这很好。在门户的起始页上,将显示来自使用dataSource2的DAO的项目列表。但是,以下每个登录到门户的用户都不会从my dataSource2获得任何结果。不会引发异常,不会出现日志消息,因为存在到数据库的有效连接,仅使用其他人的凭据,因此不会为第二个用户返回合适的结果

我的假设是,Hibernate或Spring不会以某种方式放弃以前用户的会话工厂中的旧连接并继续使用它,或者忽略我在新数据源上设置的新凭据

任何人都可以提供一些见解或有用的提示或解决方案!解决我的问题?我想知道,如果一个数据源的用户凭据在应用程序启动时不可用,但在用户登录时不可用,并且没有简单通用的方法可用,那么使用该数据源是否真的那么困难?我在web上的任何地方都找不到合适的解决方案


非常感谢。

糟透了,糟透了。我刚刚发现使用用户凭据会话工厂的DAO不在会话范围内!这导致刀被视为单刀。我想知道为什么我以前没有看到过这一点?但是,关于如何构建一个使用用户凭据的数据源,登录后可用,而不是应用程序启动时可用的,与我不同的其他伟大解决方案有什么不同?有什么最佳实践吗?
public class MyDAO extends HibernateDaoSupport {
    @Autowired
    public MyDAO(@Qualifier("sessionFactory2") SessionFactory pSessionFactory) {
        setSessionFactory(pSessionFactory);
    }
    ...
}