Spring整合Hibernate以及踩到的坑

Spring整合Hibernate

1.第一步加入Hibernate需要的jar包

**2.在hibernate的配置文件中配置基本的配置

1).配置是否在控制台打印sql
2).是否格式化sql
3).配置数据库方言
4).配置生成数据表策略
5).配置Hibernate二级缓存相关**

<?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>
    	<!-- 配置Hibernate的基本属性 -->
        <!-- 1.数据源配置到IOC容器中 -->
        <!-- 2.关联的.hbm.xml也在IOC容器配置SessionFactory实例 -->
        <!-- 3.配置Hibernate的基本属性:方言,SQL显示及格式化,生成数据表的策略以及二级缓存 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

3.创建实体类,这里在 zhang.spring.beans包下面创建了
Order和Customer
以及利用hibernate插件生成对应的bean的映射文件,Customer.hbm.xml,Order.hbm.xml

package zhang.spring.beans;

public class Customer {
	private int id;
	private String name;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Customer() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

order类

package zhang.spring.beans;

public class Order {
	private int orderId;
	private String orderName;
	private Customer customer;
	
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public void setOrderName(String orderName) {
		this.orderName = orderName;
	}
	public String getOrderName() {
		return orderName;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	
	public Order() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Order [orderId=" + orderId + ", orderName=" + orderName +  "]";
	}
	

}

4.在类路径下创建数据库相关的属性文件db.properties

**jdbc.user=root
jdbc.password=zhangyukang
jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hibernate**

5.加入Spring的jar包

6.配置Spring的配置文件applicationContext.xml文件

1)配置要引入的属性文件
2)配置C3P0数据源
3)配置SessionFactory
4)配置Hibernate的事务管理器
5)配置事务属性
6)配置切点的配置,以及将切点和事务属性关联起来
**<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package="zhang.spring.daoimpl"></context:component-scan>
<context:property-placeholder location="classpath:db.properties"/>
<bean id="comboPooledDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="user" value="${jdbc.user}"></property>
	<property name="password" value="${jdbc.password}"></property>
	<property name="driverClass" value="${jdbc.driverclass}"></property>
	<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!-- 配置SessionFactory -->
<bean id="SessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	<property name="dataSource" ref="comboPooledDataSource"></property>
	<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	<property name="mappingLocations" value="classpath:zhang/spring/beans/*.hbm.xml"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="SessionFactory"></property>
</bean>
<!-- 配置事务的属性 -->
<tx:advice id="txadvice" transaction-manager="hibernateTransactionManager">
	<tx:attributes>
		<tx:method name="find*" read-only="true"/>
		<tx:method name="get*" read-only="true"/>
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>
<!-- 配置切面,并且关联对应的切点和事务属性关联 -->
<aop:config>
	<aop:pointcut expression="execution(* zhang.spring.daoimpl.*.*(..))" id="ponitcut"/>
	<aop:advisor advice-ref="txadvice" pointcut-ref="ponitcut"/>
</aop:config>

**
**踩到的坑:
1.在配置切面的时候配置的包要 zhang.spring.dao

2.在创建的Order类的时候,重写了Order的通string的方法,在查询order对象的时候,
出现了懒加载异常,原因是应为在System.out.prinlt(order)的时候,tostring中有对应的Customer,
但是因为dao中的方法已经结束,事务已经提交,因此这里出现了懒加载异常
3.不能再IOC容器中通直接获取实现类的对象**