# spring4hibernate3 **Repository Path**: zteas/spring4hibernate3 ## Basic Information - **Project Name**: spring4hibernate3 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-12-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring4 整合 Hibernate3 基本使用(通过注入 SessionFactory) [TOC] ## 步骤 1 :导入 maven 依赖 1、Spring4 的模块 spring-core、spring-context、spring-beans、spring-jdbc、spring-orm、spring-tx、spring-test 具体的 maven 配置,可以到 Maven Repository: Search/Browse/Explore http://mvnrepository.com/ 中查询,这里为了节约篇幅就不粘贴出来了。 2、mysql 驱动 mysql-connector-java 3、hibernate3 这一节我们集成 Hibernate3,我们将在将来的文章中介绍如何集成 Hibernate4。 ``` org.hibernate hibernate-core 3.6.10.Final ``` 4、Druid 数据源 druid 5、javassist 这是 Hibernate 的依赖包。 ``` org.javassist javassist 3.20.0-GA ``` 6、aspectjweaver (Spring AOP 依赖) ``` org.aspectj aspectjweaver 1.8.7 ``` ## 步骤 2 :编写 beans 核心配置文件 0、基本配置 ``` ``` 1、配置数据源 ``` ``` 2、配置 SessionFactory 创建 Spring 的 `SessionFactory` 工厂 ,如果使用的是 Annotation 的方式,不能使用 `LocalSessionFactoryBean` ,而应该使用 `org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean` 。 ``` com.liwei.model org.hibernate.dialect.MySQLDialect true update false ``` 注意:我们集成 Hibernate3 使用的类是 `org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean`。 3、配置和事务相关 配置 Spring 事务处理,**只有配置了事务处理之后, Spring 才能有效的管理事务**。 (1)配置事务管理器 注意: 注意,这里要根据不同的持久化框架选择不同的事务管理器 。 ``` ``` (2)配置事务通知 ``` ``` ## 步骤 3:编写实体类 为实体类添加 Hibernate 的 Annotation 或者 hbm 文件。 并且添加标准化的 JPA 注解。 ``` Table(name = "t_group") @Entity public class Group { private Integer id; private String name; @GeneratedValue @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` ## 步骤4:编写基于 Hibernate 的 DAO 层 注意:我们这里 Hibernate3 持久化的操作是通过依赖注入了 `SessionFactory` 来完成的。所以我们在每个 DAO 层都要依赖注入 `SessionFactory` ,通过 `SessionFactory` 的 `getCurrentSession()` 方法来完成对实体类的操作。 即 1、在相应的 DAO 中注入相应的 `SessionFactory`(补充说明 `SessionFactory` 有很多种,根据集成的持久化框架和版本所决定); 2、如果通过 Spring 来管理相应的 `SessionFactory`,不再使用 `factory.openSession()` 开启 session ,而应该是用 facotry.getCurrentSession 来打开 Session ,这个 Session 就会被 Spring 所管理,此时开发人员不用进行事务控制,也不用关闭 Session ,全部由 Spring 容器来完成。 我们的问题:所有的 DAO 层类都要依赖注入 `SessionFactory` ,然后再获得 Session ,重复代码太多了。 解决方案:编写一个 DAO 层的基类,所有的 DAO 层类都继承这个基类就可以了。 ``` @Repository(value="groupHibernateDao") public class GroupHibernateDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession(){ return sessionFactory.getCurrentSession(); } public void groupAdd(Group group){ getSession().save(group); System.out.println(group.getId()); } } ``` ## 步骤5:编写测试方法: ``` @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = {"classpath:beans.xml"}) public class HibernateSpringTest { @Autowired private GroupHibernateDao groupHibernateDao; @Test public void testAdd() { Group group = new Group(); group.setName("技术研发部"); groupHibernateDao.groupAdd(group); User user =new User("liwei","123456","李威威"); user.setGroup(group); userHibernateDao.add(user); } } ``` ## 进一步研究 我们需要把 DAO 层抽象成接口,这样我们可以添加不同的实现。 ``` public interface IGroupDao { public void add(Group group); public Group load(int id); } ``` ``` public interface IUserDao { public void add(User user); public void update(User user); public void delete(User user); public User load(int id); public List list(String hql, Object[] params); } ``` 此时实现类的声明部分变为: ``` @Repository(value="groupHibernateDao") public class GroupHibernateDao implements IGroupDao{ ``` ``` @Repository public class UserHibernateDao implements IUserDao{ ``` 上面我们指出了每一个 DAO 层都要注入 `SessionFactory`,我们可以写一个基类 `BaseDao` 完成依赖注入。 ``` public class BaseDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } // 获取 Session,注意:没有使用 openSession() ,使用 getCurrentSession()才能被 Spring 管理 public Session getSession(){ return sessionFactory.getCurrentSession(); } } ``` 此时实现类的声明部分变为: ``` @Repository(value="groupHibernateDao") public class GroupHibernateDao extends BaseDao implements IGroupDao{ ``` ``` @Repository public class UserHibernateDao extends BaseDao implements IUserDao{ ```