(9)spring4整合Hibernate5

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关闭不过需要再取数据时(延迟加载),就会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值