我正在开发一个 Java webapp,其中 Spring 3.2.1 和 Hibernate 4.1.9 绑定到 Postgres Advanced Server 后端(用于行级安全性)。我要解决的问题是如何将 webapp 登录用户绑定到 Hibernate 会话。具体来说,如果用户 A 登录,那么我希望 webapp 与数据库的连接使用 A' 凭据(只有这样我才能过滤 A 有权查看/更改的记录)。Webapp 和数据库用户在同一个 ldap 服务器上进行验证。
我的配置信息如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.mycom.proj.model.A</value>
<value>com.mycom.proj.model.B</value>
<value>com.mycom.proj.model.C</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${db.hibernate.dialect}</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
基于上述配置,dataSource 和 sessionFactory bean 是单例的。
我可以采取的一种方法是将 dataSource 和 sessionFactory 设置为“会话”范围。我犹豫要不要采用这种方法,原因如下:
a)如果数据库连接在会话范围内,那么我不能使用连接池。(我想我可能不得不忍受它) b)我担心将 sessionFactory 设置为会话范围会破坏 Hibernate 的缓存机制。
关于如何解决这个问题的任何想法/想法?
提前致谢。