spring 中配置sessionFactory及用法
大家好,又见面了,我是你们的朋友全栈君。
spring 中配置sessionFactory及用法
方法一:
1、在Spring的applicationContext.xml中配置bean
<!– 启用注解注入 –> <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”/>
<!– 添加事务管理 –> <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>
2、添加类BaseSessionFactoryImpl用于获取Session,类BaseSessionFactoryImpl的内容如下:
public class BaseSessionFactoryImpl {
@Resource(name=”sessionFactory”) private SessionFactory sessionFactory=null; public Session getSession(){ return sessionFactory.getCurrentSession(); } }
3、在Dao层获取Session,
public class UserDaoImplextends BaseSessionFactoryImpl {
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>
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155203.html原文链接:https://javaforall.cn
相关文章
- 将 Bean 放入 Spring 容器中的五种方式 !
- java面试题 --- Spring②
- logback-spring.xml配置文件(最佳实践)
- Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
- Spring Boot源码学习:自动配置与自定义注解详解
- Spring-Security 简介、入门案例详解、安全框架、权限验证 SSM项目 使用 JavaConfig配置
- Spring-boot_Spring Boot
- Spring基本概念梳理
- Spring事物(@transactional注解)在什么情况下会失效,为什么?
- Spring Data默认值的错误
- Spring Cloud Config
- ldap客户端 spring boot ldap
- Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响
- 配置Spring Cloud Feign(二)
- 配置Spring Cloud Feign(三)
- Spring MVC文件上传
- spring mvc 日期转换详解编程语言
- Spring详解(一)——概述编程语言
- Spring Boot全局支持CORS(跨源请求)的配置方法详解编程语言
- Spring Boot2.0之 jar打包方式详解编程语言
- Spring Boot 配置随机数技巧详解编程语言
- spring Boot(十九):使用Spring Boot Actuator监控应用详解编程语言
- spring架构利器:JFinal MySQL Spring(jfinalmysql)