今天在使用Spring3整合Hibernate4的时候遇到了些问题,所以在这记录下Spring3整合Hibernate4 Annotation的详细步骤,为了以后学习Spring的同学节省点时间。
以上是Spring文档上的例子,在这例子中 它是通过配置dataSource来配置sessionFactory
LocalSessionFactoryBean 有关持久化类的配置采用的是xml的形式 那么如果我们要使用Annotation的形式怎么做呢?
如果使用的是Hibernate3的话就使用第一个红框里的类 他继承了LocalSessionFactoryBean(hibernate3包里的)
如果使用的是Hibenate4的话就使用第第二个红框里的类
首先给大家看下总体的结构图 再给大家看下我的bean的配置
Beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring" />
<property name="username" value="root" />
<property name="password" value="admin" />
</bean>
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>com.ksjl.entity.Teacher</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.format_sql">true</prop>
</props>
</property>
</bean>
<bean id="teacherDAOImpl" class="com.ksjl.dao.Impl.TeacherDAOImpl">
<property name="factory" ref="mySessionFactory"></property>
</bean>
<bean id="teacherService" class="com.ksjl.service.TeacherService">
<property name="teacherDAO" ref="teacherDAOImpl"></property>
</bean>
</beans>
有人会感到疑问,property中 name为 anotatedClasses 和 hibernateProperties在哪里?答案在LocalSessionFactoryBean的源码中 大家看了就明白了
好了,beans.xml写好了,下面给大家看下其他类的源码 然后我们测试一下能否正常使用
TeacherDAO:
package com.ksjl.dao;
import com.ksjl.entity.Teacher;
/**
* @author 旷世绝伦
*
* */
public interface TeacherDAO {
/**
* @param t 要插入的Teacher对象
*
* */
public void insert(Teacher t);
}
TeacherDAOImpl:
package com.ksjl.dao.Impl;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.ksjl.dao.TeacherDAO;
import com.ksjl.entity.Teacher;
/**
* @author 旷世绝伦
*
* */
public class TeacherDAOImpl implements TeacherDAO {
private SessionFactory factory;
public SessionFactory getFactory() {
return factory;
}
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
@Override
public void insert(Teacher t) {
// TODO Auto-generated method stub
Session session = factory.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
}
Teacher:
package com.ksjl.dao.Impl;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.ksjl.dao.TeacherDAO;
import com.ksjl.entity.Teacher;
/**
* @author 旷世绝伦
*
* */
public class TeacherDAOImpl implements TeacherDAO {
private SessionFactory factory;
public SessionFactory getFactory() {
return factory;
}
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
@Override
public void insert(Teacher t) {
// TODO Auto-generated method stub
Session session = factory.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
}
Teacher:
package com.ksjl.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* @author 旷世绝伦
*
* */
@Entity
public class Teacher {
private int id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "name", length = 20, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
TeacherService:
package com.ksjl.service;
import com.ksjl.dao.TeacherDAO;
import com.ksjl.entity.Teacher;
/**
* @author 旷世绝伦
*
* */
public class TeacherService {
private TeacherDAO teacherDAO;
public TeacherDAO getTeacherDAO() {
return teacherDAO;
}
public void setTeacherDAO(TeacherDAO teacherDAO) {
this.teacherDAO = teacherDAO;
}
/**
* @param t 要插入的对象
*
* */
public void insert(Teacher t) {
teacherDAO.insert(t);
}
}
TeacherServiceTest:
package com.ksjl.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ksjl.entity.Teacher;
/**
* @author 旷世绝伦
*
* */
public class TeacherServiceTest {
@Test
public void insert() {
ApplicationContext context = new ClassPathXmlApplicationContext();
TeacherService service = (TeacherService) context
.getBean("teacherService");
Teacher t = new Teacher();
t.setName("zhangsan");
service.insert(t);
}
}
成功插入,整合完成!
提示:
1.由于在beans.xml中我没有配置hibernate的hbm2ddl.auto属性 所以大家要自己建下表!
2.我这边使用的是 Spring3.2+Hibernate4 测试采用的是Junit 还有由于是采用的是dbcp 所以别忘了添加jar包!
2013/10/5 旷世绝伦