我有一个 JSF、Spring、Hibernate 和 Spring Security 中的应用程序,Hibernate 层和数据库之间的交互进展顺利,一旦 Spring Security 层,查询就不会呈现任何内容。
有什么解决办法吗?
我正在从 hibernate 配置文件创建 SessionFactory
web.xml 中的过滤器: ......................
!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
........................
hibernate session 工厂创建类:
......................
package Util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration configuration = new AnnotationConfiguration();;
configuration.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(sr);
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
<小时/>
@Transactional
public class stufImp implements stufDAO , Serializable {
private SessionFactory sf = HibernateUtil.getSessionFactory();
Session session ;
public stufImp() {
}
@Override
public List<Stuf> getAllstufs() {
session=sf.getCurrentSession();
session.beginTransaction();
List<Stuf> stufs= session.createQuery("from Stuf").list();
session.getTransaction().commit();
System.out.println("getting All Stufs");
return stufs;
}
......................
最佳答案
对于初学者,首先删除用于配置 hibernate 的 HibernateUtil,然后修复您的 dao。您不应该永远将Session
存储在实例变量中,至少当您的dao是单例时不应该。 (想象一下如果有 2 个并发请求进来会发生什么, session 会发生什么!)。
要配置 hibernate SessionFactory
,请使用 spring 中的 LocalSessionFactoryBean
。 (更多信息请参见the reference guide和javadoc)。
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
</bean>
您还需要事务管理器并启用注释驱动的事务。
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven /> <!-- By default references 'transactionManager' -->
修改您的 dao(请参阅 reference guide )。
@Transactional
public class stufImp implements stufDAO , Serializable {
@Autowired
private SessionFactory sf;
@Override
public List<Stuf> getAllstufs() {
return sf.getCurrentSession().createQuery("from Stuf").list();
}
}
链接
- 在 Spring 设置 SessionFactory reference guide
- 实现 daos reference guide
关于java - Spring Security 过滤器阻止所有 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834852/