Spring 是否在applicationContext-security.xml中只调用一次sessionFactory?

Spring 是否在applicationContext-security.xml中只调用一次sessionFactory?,spring,hibernate,security,login,Spring,Hibernate,Security,Login,我不确定atm的问题是,我让hibernate通过用户表处理我的登录。如果在应用程序运行时操作此表,则登录端不会发生任何更改(不管它们在表上如何操作,我使用ZK进行操作,并且可以正确地看到更改)。 因此,如果我使用以下工具登录: 管理员密码 然后将密码更改为newpassword 我必须清理并构建应用程序,然后在登录发生更改之前运行它。 换句话说,我认为它只检查用户表数据一次,把它放在什么地方 无论如何,我认为代码可能会有所帮助: applicationContext-security.xml的

我不确定atm的问题是,我让hibernate通过用户表处理我的登录。如果在应用程序运行时操作此表,则登录端不会发生任何更改(不管它们在表上如何操作,我使用ZK进行操作,并且可以正确地看到更改)。 因此,如果我使用以下工具登录: 管理员密码

然后将密码更改为newpassword

我必须清理并构建应用程序,然后在登录发生更改之前运行它。 换句话说,我认为它只检查用户表数据一次,把它放在什么地方

无论如何,我认为代码可能会有所帮助:

applicationContext-security.xml的代码段

<beans:bean id="sesFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <beans:property name="configLocation">
        <beans:value>classpath:\hibernate.cfg.xml</beans:value>
    </beans:property>
</beans:bean>

<beans:bean id="userDAO" class="login.UserLoginDAOImpl">
            <beans:property name="sessionFactory" ref="sesFactory"></beans:property>
</beans:bean>

<beans:bean id="userService" class="login.UserLoginService">
    <beans:property name="userDAO" ref="userDAO"></beans:property>
</beans:bean> 

<authentication-manager>
     <authentication-provider user-service-ref="userService">
        <!--<password-encoder hash="sha" />-->
     </authentication-provider>      
</authentication-manager>

类路径:\hibernate.cfg.xml
hibernation.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">admin</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>


     <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>


    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>



    <mapping class="contacts.Contacts" />
    <mapping class="login.Users" />
</session-factory>
</hibernate-configuration>

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
根
管理
1.
线
org.hibernate.cache.NoCacheProvider
org.hibernate.dialogue.mysqldialogue
真的
UserLoginDaoImpl:

 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
  package login;


import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * The Class UserLoginDAOImpl
 */
public class UserLoginDAOImpl implements UserLoginDAO {

/** The hibernate template. */
private HibernateTemplate hibernateTemplate;

/**
 * Sets the session factory.
 * 
 * @param sessionFactory
 *            the new session factory
 */
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

@Override
public Users loadUserByName(String name) {
    if (name != null && !name.equals("")) {

        List<Users> usr = hibernateTemplate
                .find("from Users where username ='" + name + "'");
                        System.out.println(usr.get(0));
        if (usr.size() == 1) {
            return usr.get(0);
        } else {
                        System.out.println("USER SIZE IS INCORRECT");
            return null;

        }
    } else {
        return null;
    }
}
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
软件包登录;
导入java.util.List;
导入org.hibernate.SessionFactory;
导入org.springframework.orm.hibernate3.HibernateTemplate;
/**
*类UserLoginDAOImpl
*/
公共类UserLoginDAOImpl实现UserLoginDAO{
/**hibernate模板*/
私有HibernateTemplate HibernateTemplate;
/**
*设置会话工厂。
* 
*@param sessionFactory
*新会话工厂
*/
public void setSessionFactory(SessionFactory SessionFactory){
this.hibernateTemplate=新的hibernateTemplate(sessionFactory);
}
@凌驾
公共用户loadUserByName(字符串名称){
if(name!=null&&!name.equals(“”){
列表usr=hibernateTemplate
.find(“来自用户名=“+”名称+“”的用户”);
System.out.println(usr.get(0));
如果(usr.size()==1){
返回usr.get(0);
}否则{
System.out.println(“用户大小不正确”);
返回null;
}
}否则{
返回null;
}
}
}

我绝对不是Hibernate方面的专家,但我认为

线程

行是不必要的,它会影响事务管理器的行为:请参阅


另外,Spring通过AnnotationSessionFactoryBean管理事务,在UserLoginDAOImpl和UserLoginService类中可能会发生一些有趣的事情

您的UserLoginDAOImpl源代码是什么?还有用户登录服务。您的
web.xml
中是否有
OpenSessionInViewFilter
?Hibernate如何识别您的会话将被关闭?代码基本上没有变化,而对于OpenSessioninViewFilter,我只是尝试了一下,但没有成功。同时尝试代理transactionManager(不起作用)。与此类似:Users类的源代码是什么?如果没有它,我会得到:org.hibernate.hibernateeexception:No CurrentSessionContext configured!:(请将实际的UserLoginDAOImpl源代码添加到您的问题中。无论如何,您可以重构它以使用我希望:)不清楚在您的配置中如何打开和关闭事务。用它更新了答案,我尝试使用典型的hibernateUtil类-打开会话,开始事务,然后提交。我的应用程序的其余部分与hibernateUtil的更新配合得很好,但具体来说,登录没有。没有配置CurrentSessionContext的堆栈跟踪是什么?你是从UserLoginDAOImpl还是其他地方得到的?啊哈!对sessionFactory的内容很少更改,hibernateTemplate使用currentsession而不是openSession。所以我刚刚创建了一个新会话/打开了它/开始了会话/提交了感谢各位的回复!)(无法回答我自己的自动取款机问题,帐户已~8小时)