- 在Spring中使用Hibernate时,一般使用HibernateDaoSupport或HibernateTemplate获得HibernateTemplate对象对数据库进行CURD的操作。下面分别用这两种方式做一个例子。
- 在DAO中注入HibernateDaoSupport类的方式。
-
spring配置文件代码:
<context:annotation-config/>//开启注解
<context:component-scan base-package="dao,service"/>//扫描注解的包//使用commons-dbcp2配置一个数据源 <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///hibernate"/> <property name="username" value="root"/> <property name="password" value="java"/> </bean> //配置Hibernate的sessionFactory <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> //配置Hibernate <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.farmat_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> </props> </property> <property name="annotatedClasses" value="model.Student"/>//注解的model类 <property name="dataSource" ref="dataSource"/> </bean> //需要注入的到DAO中的HibernateTemplate <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/ </bean> <tx:annotation-driven/>//开启事务注解 <!--把sessionFactory注入到HibernateTransactionManager中、,Hibernate在进行CUD时需要开启事务,但是我们又不直 接使用Hibernate的session,所以我们需要把Hibernate中的事务交给spring管理 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
-
DAO继承HibernateDaoSupport,java代码:
@Repository
public class StudentDao {
@Autowired
private HibernateTemplate hibernateTemplate;public void save(Student student){ hibernateTemplate.save(student); } }
service层代码:
@Transactional(readOnly=false)
@Service
public class StudentService {
@Autowired
private StudentDao studentDao;
public void save(Student student){
studentDao.save(student);
}
}测试类代码:
public class Application {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-hibernate.xml");
StudentService service = context.getBean(StudentService.class);
service.save(new Student("月明飞", "nan"));
}
}
DAO继承HibernateDaoSupport类的方式,和上面几乎相同,我们只需要在DAO的bean中配置一个SessionFactory,HibernateDaoSupport可以自动为HibernateTemplate赋值,在DAO中使用this.getHibernateTemplate()方法返回一个HibernateTemplate对象。这种方式的缺点就是DAO不能再继承其他的类。
以上的方式貌似是完美的,可是Spring文档中的Demo却是使用在DAO中注入SessionFactory的方式----sessionFactory.getCurrentSession()返回一个session对象,通过这个对象对数据库进行CURD操作。
-
model类代码:
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int id;@Column(unique=true) public String name; public String sex; public Student(){} public Student(String name, String sex) { super(); this.name = name; this.sex = sex; } 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]"; } }