1.导入spring 包和hibernate 包(hibernate中lib中的required(必备),以及jpa包)
2.导入dbcp包和log4j(解析XML的)和commons-logging-1.2(Junit必备)
3.配置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" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 打开Spring的Annotation支持 -->
<context:annotation-config />
<!-- 设定Spring 去哪些包中找Annotation -->
<context:component-scan base-package="spring" />
<!--Spring +Hibernate整合 -->
<!--加载数据库的连接配置文件 -->
<context:property-placeholder location="jdbc.properties"/>
<!--配置数据库来连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!--驱动类全称 -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<!--数据库的url地址 -->
<property name="url" value="${jdbc.url}" />
<!--用户名 -->
<property name="username" value="${jdbc.username}" />
<!--密码 -->
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--1、配置数据库连接池 -->
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan">
<value>spring.model</value>
</property>
<!--2、Hibernate的配置信息 -->
<property name="hibernateProperties">
<props>
<!--方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--事物管理对象(session初始化(con,ps,rs)以及事务处理等) -->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--配置事物的通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 事物的属性,其实就是为切面中的哪些方法进行事物的配置 -->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--aop配置信息 -->
<aop:config>
<aop:pointcut id="pcut" expression="execution(* spring.dao.*.*(..))"/><!--一执行dao中所有类中的所有方法就进行事务处理 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pcut"/>
</aop:config>
</beans>
4.创建实体类:
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
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;
}
}
@Entity
@Table(name="t_user")
public class User {
private int id;
private String username;
private String password;
private String nickname;
private Group group;
@ManyToOne
@JoinColumn(name="gid")
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public User(String username, String password, String nickname) {
super();
this.username = username;
this.password = password;
this.nickname = nickname;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public User() {
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", nickname=" + nickname
+ ", group=" + group + "]";
}
}
注意:(1).注释(annotaion)统一写在属性上或者统一写在get上,一定要统一,要不然会报Could not determine type for的错误
5.创建dao类
BaseDao:
public class BaseDao {
private SessionFactory SessionFactory;
public SessionFactory getSessionFactory() {
return SessionFactory;
}
@Resource(name="sessionFactory")
public void setSessionFactory(SessionFactory sessionFactory) {
SessionFactory = sessionFactory;
}
protected Session getSession() {
return SessionFactory.getCurrentSession();
}
}
注意:(1).此处使用创建SessionFactory然后注入的方法,以后我们会使用Template或者DaoSupport
(2).创建一个protected的getSession方法(只能子类调用),然后返回sessionFactory.getCurrentSession();
UserHibernateDao:
@Repository("userHibernateDao")//spring管理
public class UserHibernateDao extends BaseDao implements IUserDao {
private IGroupDao groupHibernateDao;
public IGroupDao getGroupHibernateDao() {
return groupHibernateDao;
}
@Resource//注入
public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
this.groupHibernateDao = groupHibernateDao;
}
@Override
public void update(User user) {
// TODO 自动生成的方法存根
this.getSession().update(user);
}
@Override
public void delete(int id) {
// TODO 自动生成的方法存根
this.getSession().delete(id);
}
@Override
public User load(int id) {
// TODO 自动生成的方法存根
return this.getSession().load(User.class, id);;
}
@SuppressWarnings("unchecked")
@Override
public List<User> list(String sql, Object[] args) {
// TODO 自动生成的方法存根
Query<User> q=this.getSession().createQuery(sql);//通过session创建hql语句
for(int i=0;i<args.length;i++) {
q.setParameter(i, args[i]);//从0开始
}
List<User> list=q.list();
return list;
}
@Override
public void add(User user, int gid) {
// TODO 自动生成的方法存根
Group group=groupHibernateDao.load(gid);
user.setGroup(group);
getSession().save(user);
}
}
GroupHibernateDao:
@Repository("groupHibernateDao")
public class GroupHibernateDao extends BaseDao implements IGroupDao {
//不能再注入UserHibernateDao,因为会相互注入,就会报错,可以使用service分层解决
@Override
public void add(Group group) {
// TODO 自动生成的方法存根
getSession().save(group);
}
@Override
public Group load(int id) {
// TODO 自动生成的方法存根
return (Group)getSession().load(Group.class, id);
}
}
注意:(1).该类不能再注入UserHibernateDao,因为会相互注入,就会报错,可以使用service分层解决
6.测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml")
public class TestHibernate {
@Resource(name="userHibernateDao")
private IUserDao userHibernateDao;
@Resource(name="groupHibernateDao")
private IGroupDao groupHibernateDao;
@Test
public void test() {
Group group=new Group();
group.setName("test");
groupHibernateDao.add(group);
User user=new User("wukong", "123", "悟空");
userHibernateDao.add(user, group.getId());
}
}
注意:(1).出现NotClassDefFoundError就是少导包
(2).由于session关闭和延迟加载的原因,当session关闭不过需要再取数据时(延迟加载),就会报错