Spring中使用ORM的好处
– 便于测试
– 通用数据访问异常封装
– 通用的资源管理
– 完整简便的事务管理
当sping和hibernate整合的两种方式:
方法一:使用c3p0连接池的方式(事先需要导入一个jar包)
使用c3p0的目的是为了把连接池还有mapping的信息等独立出来配置到application里面,而不是写在hibernate。xml里面,换句话说就是把hibernate.xm整合到application.xml里面。
好了,那么我们先来看看没有整合hibernate。xml和application.xml文件之前配置spring的hibernate的持久化是怎么写的
application
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFacto
ryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:hibernate.cfg.xml" />
</bean>
hibernate.xml部分:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 1,数据库连接信息 -->
<property name="dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</property>
<property name="connection.url">jdbc:mysql:///itcastoa0720</property>
<property name="connection.driver_class">com.jdbc.mysql.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 2,其他配置 -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 3,导入映射文件 -->
<mapping resource="com/it/oa/domain/User.hbm.xml" />
<mapping resource="com/it/oa/domain/Role.hbm.xml" />
<mapping resource="com/it/oa/domain/Department.hbm.xml" />
<mapping resource="com/it/oa/domain/Privilege.hbm.xml" />
</session-factory>
</hibernate-configuration>
下面是使用了整合了之后的application.xml
<!-- 配置连接池的信息 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 数据库连接的四个基本参数 -->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置Hibernate的相关属性 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate的其他的属性 -->
<property name="hibernateProperties">
<props>
<!-- Hibernate的方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
<!-- 配置映射文件 -->
<property name="mappingResources">
<list>
<value>cn/i/shop/user/User.hbm.xml</value>
<value>cn/it/shop/category/Category.hbm.xml</value>
<value>cn/it/shop/product/Product.hbm.xml</value>
<value>cn/it/shop/categorysecond/CategorySecond.hbm.xml</value>
<value>cn/it/shop/order/Order.hbm.xml</value>
<value>cn/it/shop/order/OrderItem.hbm.xml</value>
<value>cn/it/shop/adminuser/AdminUser.hbm.xml</value>
</list>
</property>
</bean>
纤细说明:
直接在Bean中配置Hiberate的属性
<bean id=“sessioinFactory”
class=“ort.springframework.orm.hibernate.LocalsessionFactoryBea
n”>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto"> update </prop>
<prop key="hibernate.show_sql">false </prop>
</props>
</property>
</bean>
在一个实体类里面怎么通过spring注入sessionfactory呢
下面我们来尝试一下:
在Spring中访问Hibernate的方法
现在application.xml里面配置一下信息
<bean id="articleHibernateDao" class="com.sc.UserDaoHibernateImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
方式一:继承父类
class UserDaoHibernateImpl extends HibernateDaoSupport{
public User getUser(long id) {
return getHibernateTemplate().get(User.class, id);
}
}
(解释:
(1)Spring提供的DAO(数据访问对象)支持目的是便
于以一致的方式使用不同的数据访问技术, 如
JDBC,Hibernate或者JDO等。
(2)HibernateDaoSupport - Hibernate数据访问对象的基类。
需要一个SessionFactory,同时为子类提供
HibernateTemplate。也可以选择直接通过 提供一个
HibernateTemplate来初始化,那个就要在对象中继承父类HibernateDaoSupport,然后通过this.getHibernateTemplate()得到一个session
(3)我们再来看看抽象父类HibernateDaoSupport的源码
)
方式二:传统的依赖注入方法
class UserDaoHibernateImpl {
@Resource
private SessionFactory sessionFactory;
//不用注解的方式就要实现 sessionFactory的get,set方法
public User getUser(long id) {
return sessionFactory.getCurrentSession().get(User.class, id);
}
}