spring 中配置sessionFactory及用法java
方法一:mysql
一、在Spring的applicationContext.xml中配置beanspring
<!-- 启用注解注入 -->
<context:annotation-config />
<!-- spring扫描的包 -->
<context:component-scan base-package="com.iven"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.MySQL.jdbc.Driver" />
<property name="url" value="jdbc:mysql://172.25.9.99:3306/fzghc" />
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 配置Spring的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="annotatedClasses">
<list>
<value>com.iven.entity.User</value>
<value>com.iven.entity.Repairs</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
<!-- hibernate.dialect=org.hibernate.dialect.SQLServerDialect -->
hibernate.show_sql=true
</value>
</property>
</bean>
<!-- 添加事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>sql
<!-- 添加事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="queryByUsername" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.iven.dao.*.*(..))" id="fooServiceOperation"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
express
二、添加类BaseSessionFactoryImpl用于获取Session,类BaseSessionFactoryImpl的内容以下:apache
public class BaseSessionFactoryImpl {session
@Resource(name="sessionFactory")
private SessionFactory sessionFactory=null;
public Session getSession(){
return sessionFactory.getCurrentSession();
}
}app
三、在Dao层获取Session,url
public class UserDaoImplextends BaseSessionFactoryImpl
{spa
public User queryByUsername(String userName) {
User user=null;
String sql="select user from User user where user.userName="+userName;
try {
user=(User) getSession().get(User.class, 1);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
}
4.重点注意事项
SessionFactory的getCurrentSession并不能保证在没有当前Session的状况下会自动建立一个新的,这取决于CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的currentSession()方法来得到Session。
在Spring中,若是咱们在没有配置TransactionManager而且没有事先调用SessionFactory.openSession()的状况直接调用getCurrentSession(),那么程序将抛出“No Session found for current thread”异常。
若是配置了TranactionManager而且经过@Transactional或者声明的方式配置的事务边界,那么Spring会在开始事务以前经过AOP的方式为当前线程建立Session,此时调用getCurrentSession()将获得正确结果。
然而,产生以上异常的缘由在于Spring提供了本身的CurrentSessionContext实现,若是咱们不打算使用Spring,而是本身直接从hibernate.cfg.xml建立SessionFactory,而且为在hibernate.cfg.xml
中设置current_session_context_class为thread,也即便用了ThreadLocalSessionContext,那么咱们在调用getCurrentSession()时,若是当前线程没有Session存在,则会建立一个绑定到当前线程。
Hibernate在默认状况下会使用JTASessionContext,Spring提供了本身SpringSessionContext,所以咱们不用配置current_session_context_class,当Hibernate与Spring集成时,将使用该SessionContext,故此时调用getCurrentSession()的效果彻底依赖于SpringSessionContext的实现。
在没有Spring的状况下使用Hibernate,若是没有在hibernate.cfg.xml中配置current_session_context_class,有没有JTA的话,那么程序将抛出"No CurrentSessionContext configured!"异常。此时的解决办法是在hibernate.cfg.xml中将current_session_context_class配置成thread。
在Spring中使用Hibernate,若是咱们配置了TransactionManager,那么咱们就不该该调用SessionFactory的openSession()来得到Sessioin,由于这样得到的Session并无被事务管理。
至于解决的办法,能够采用以下方式:
1. 在spring 配置文件中加入
<tx:annotation-driven transaction-manager="transactionManager"/>
而且在处理业务逻辑的类上采用注解
@Service public class CustomerServiceImpl implements CustomerService { @Transactional public void saveCustomer(Customer customer) { customerDaoImpl.saveCustomer(customer); } ... } 另外在 hibernate 的配置文件中,也能够增长这样的配置来避免这个错误: <property name="current_session_context_class">thread</property>