Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
对hibernate的支持主要用到spring的哪个模块_hibernate session,希望能够帮助你!!!。
Spring中使用Hibernate通常有三种方式:使用原生的Hibernate API;使用HibernateTemplate;使用HibernateDaoSupport。
Hibernate通过配置Bean信息集成到Spring中,Spring为创建SessionFactory提供了一个好用的FactoryBean工厂类:org.springframework.orm.hibernateX.LocalSessionFactoryBean, 通过在Spring中配置,就可以获取一个SessionFactoryBean,并且进行使用了。
无论使用Hibernate哪一种方式操作数据库,都需要进行以下的配置
1.1配置Data Source:定义连接数据库的数据源
1.2 配置对象关系映射文件xxx.hbm.xml
在intelJ IDEA中,可通过自动生成hibernate映射的插件进行生成。会生成xxx.cfg.xml配置文件
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/sampledb</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <mapping resource="com/smart/domain/TBoard.hbm.xml"/> <mapping class="com.smart.domain.TBoard"/> <mapping resource="com/smart/domain/TLoginLog.hbm.xml"/> <mapping class="com.smart.domain.TLoginLog"/> <mapping resource="com/smart/domain/TPost.hbm.xml"/> <mapping class="com.smart.domain.TPost"/> <mapping resource="com/smart/domain/TTopic.hbm.xml"/> <mapping class="com.smart.domain.TTopic"/> <mapping resource="com/smart/domain/TUser.hbm.xml"/> <mapping class="com.smart.domain.TUser"/> <!-- <property name="connection.username"/> --> <!-- <property name="connection.password"/> --> <!-- DB schema will be updated if needed --> <!-- <property name="hbm2ddl.auto">update</property> --> </session-factory> </hibernate-configuration>
1.3 配置sessionFactory 的bean
以上配置文件定义了数据源、映射文件的信息,通过这些信息在Hibernate中可以使用一个配置文件创建了一个sessionFacotry实例。在Spring中也可以通过指定Hibernate的这个配置文件来创建sessionFactory实例
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:configLocation="classpath:hiberConfig.xml"/>
说明:
configLocation和configLocations(多个文件,可用逗号隔开): 用于指定Hibernate配置文件的位置。
mappingLocations:用于指定Hibernate映射文件的位置,多个文件时,把所有文件都列上去,如:
<property name="mappingLocations"> <value>classpath:/com/smart/domain/*.hbm.xml </value> </property>
或者:
<property name="mappingLocations"> <value>classpath:/com/smart/domain/TPost.hbm.xml </value> … </property>
mappingDirectoryLocations:指定映射的文件路径,可以通过classpath来指出
<property name="mappingDirectoryLocations"> <list> <value>classpath:/xxx/package/</value> </list> </property>
packagesToScan:指定实体文件的路径,通过注解映射文件
<property name="packagesToScan"> <list> <value>com.smart.domain</value> </list> </property>
hibernateProperties:用于定义Hibernate属性,即Hibernate配置文件中的属性;
dataSource:定义数据源
(
hibernateProperties、dataSource用于消除Hibernate配置文件,因此如果使用configLocations指定配置文件,就不要设置这两个属性了,否则会产生重复配置。推荐使用dataSource来指定数据源,而使用hibernateProperties指定Hibernate属性。
)
另外一种配置方式,不需要Hibernate的配置文件xxx.cfg.xml的,如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan"> <list> <value>com.smart.domain</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </prop> <prop key="hibernate.cache.use_query_cache">false</prop> </props> </property> </bean>
LocalSessionFactoryBean将利用Hibernate配置文件创建一个Session Factory代理对象,以便和Spring的事务管理机制配合工作:当数据访问代码使用SessionFactory时,可以获取线程绑定的Session,不管工作在本地或者全局的事务,都能正确参与到当前的Spring事务管理中去。
Spring使用Hibernate访问数据库,通过Session Factory Bean进行CUID操作,可以有以下几种方式进行事务管理。
2.1 使用Hibernate原生API操作
SessionFactory.openSession或者sessionFactory.getCurrentSession, 这种方式就需要自己管理事务,各个步骤还不能出错。
openSession跟getCurrentSession的区别就是,一个每次都是新建Session,且需要手动关闭session。 另一个获取当前Session, 不需要手动关闭session,事务会自动关闭
Spring的配置
<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}"> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan"> <list> <value>com.smart.domain</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </prop> <prop key="hibernate.cache.use_query_cache">false</prop> <!—使用getCurrentSession时需要配置 --> <prop key="hibernate.current_session_context_class">thread</prop> </props> </property> </bean>
测试代码
public class SessionTest { public static void main(String[] args){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xiaochun-dao.xml"); SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory"); TransactionManager transactionManager = new TransactionManager(); //Session session = sessionFactory.openSession(); Session session = sessionFactory.getCurrentSession(); Transaction transaction = null; try{ //开启事务 transaction = transactionManager.beginTransaction(session); TUser user = new TUser(); user.setUserName("mimi"); session.save(user); }catch (RuntimeException e){ transactionManager.rollbackTransaction(transaction); throw e; }finally { transaction.commit(); //使用getCurrentSession()就不需要以下的代码,使用openSession就需要用到 //transactionManager.commitTransaction(session); } } }
public class TransactionManager { //开启事务 public Transaction beginTransaction(Session session){ Transaction transaction = session.beginTransaction(); //已经开启事务 // transaction.begin(); return transaction; } //回滚事务 public void rollbackTransaction(Transaction transaction){ if(transaction != null){ transaction.rollback(); } } //提交事务(关闭session),getCurrentSession中不需要 public void commitTransaction(Session session){ session.close(); } }
2.2 使用HibernateTemplate
HibernateTimplate模板类用于简化事务管理及常见操作,对于复杂操作(Hibernate底层的功能,则可以使用回调接口)通过提供HibernateCallback回调接口来允许更复杂的操作。这接口配合HibernateTemplate进行工作,无需关心Hibernate Session的打开和关闭操作,仅需要定义数据访问逻辑即可。
在Spring中配置Hibernate Template bean,然后在Dao中定义注入即可使用。
HibernateTemplate的配置
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate" p:sessionFactory-ref="sessionFactory"/>
在Dao中使用HibernateTemplate
public class BaseDao<T> { private Class<T> entityClass; private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } @Autowired public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } /** * 保存PO */ public void save(T entity){ getHibernateTemplate().save(entity); } }
2.3 使用HibernateDaoSupport
Spring对Hibernate也提供了HibernateDaoSupport类来支持一致的数据库访问。HibernateDaoSupport也是DaoSupport实现,不需要配置HibernateTemplate Bean,
该类主要提供了两个方法:
public final HibernateTemplate getHibernateTemplate()
public final void setSessionFactory(SessionFactory sessionFactory)
其中,setSessionFactory方法接收来自Spring的applicationContext的依赖注入,接收了配置在Spring 中的SessionFactory实例,getHibernateTemplate方法用来利用刚才的SessionFactory生成Session,再生成HibernateTemplate来完成数据库的访问。
public class TBoardDao extends HibernateDaoSupport { private static final String COUNT_ALL_HQL = "select count(*) from TBoard "; public void save(TBoard board) { //getHibernateTemplate()为HibernateDaoSupport的函数 getHibernateTemplate().save(board); } public int countAll() { Number count = (Number) getHibernateTemplate().find(COUNT_ALL_HQL).get(0); return count.intValue(); } }
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章