1、第十三章spring管理hibernate Ø 学习目标 Ø 学习内容 在使用hibernate的过程中,我们体验到了把数据当成对象来处理的方便,但是仍然没有脱离从前使用jdbc时,打开连接关闭连接之类的重复操作。我们还是需要不停的打开session然后关闭,偶而在过程中还要处理一下事务。 而在有了spring 之后,我们这些复杂的重复劳动,终于可以解脱了。 Spring提供了对orm框架的支持,这其中当然也包括了hibernate,我们可以通过spring为hibernate提供数据源,管理映射对象,管理事务等。 先来做一个干扰性最小的集成方式,在本例中,hibernate的
2、配置完全由自己完成,不依赖spring,只由spring管理session对象与事务处理。 创建实体对象User.java package ch04.entity; import java.io.Serializable; public class User implements Serializable { private Integer uid; private String username; private String password; public Integer getUid() { return uid; } public voi
3、d setUid(Integer uid) { this.uid = uid; } 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 =
4、 password;
}
}
映射文件:
User.hbm.xml
5、
6、
root
7、y name="connection.url">jdbc:mysql://127.0.0.1:3306/test?&useUnicode=true&characterEncoding=gb2312
8、/property>
9、e ch04.dao;
import ch04.entity.User;
public interface UserDao {
boolean add(User u);
boolean del(User u);
User getUserByName(User u);
}
实现类,需要继承自org.springframework.orm.hibernate3.support.HibernateDaoSupport 类,以便于spring可以为本类对象注入sessionfactory对象。
UserDaoImpl.java
package ch04.dao.impl 10、
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import ch04.dao.UserDao;
import ch04.entity.User;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public bo 11、olean add(User u) {
try {//得到操作模板
this.getHibernateTemplate().save(u);
return true;
} catch (DataAccessException e) {
logger.error(e);
return false;
}
}
public boolean del(User u) {
getSession().delete(u);
return false;
}
public User getUserBy 12、Name(User u) {
List 17、
19、注意,这个方法签名定义切点的方式,支持的是方法:
execution(public * *(..))
所有公有的方法, 第一个*表示返回值 第二个表示方法名
execution(* *User(..))这里第一个星表示返回值类型
上面定义了关注所有以User结尾的方法
如:getUser() addUser() deleteUser()
execution(* ch04.dao.UserDao.*(..))
关注userdao接口定义的方法
execution(* ch04.dao.UserDao+.*(..))
关注userdao接口和子类的 20、方法,注意,这里包括了UserDaoImpl中定义的方法
execution(* com..*.*Dao.find*(..))
关注所有com包中子包内后缀为Dao的类里,以find开头的方法
关于参数的定义execution(* add(..))
..表示的任意多个任意类型的参数
也可以用*来表示任意类型参数
如:
execution(* add(*,int))
execution(* add(String,..))第一个参数为String其它不限
除了上面对于相应的hibernate事务处理进行aop管理之外,还可以为事务进行更详细的 21、配置,比如:
24、mport ch04.dao.UserDao;
import ch04.entity.User;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("ch04/spring-hibernate.xml");
UserDao ud=(UserDao) ac.getBean("userDao");
//加用户
User u=new User();
u.set 25、Username("admin");
// u.setPassword("aaa");
ud.add(u);
u=ud.getUserByName(u);
System.out.println(u.getUid()+":"+u.getUsername()+":"+u.getPassword());
}
}
运行结果:
Hibernate:
insert
into
usertable
(username, password)
values
(?, ?)
Hi 26、bernate:
select
this_.uid as uid0_0_,
this_.username as username0_0_,
this_.password as password0_0_
from
usertable this_
where
(
this_.username=?
)
1:admin:null
在上面的例子中,hibernate本身配置由自己完成,spring只起到辅助作用,帮助使用者完成了相应 27、的sessionfactory、session及事务的管理。当然还有更深入的一些方式,比如我们可以省掉hibernate的配置文件,sessionfactory完全由spring提供。
其它部分基本一置,去掉hibernate.cfg.xml就行了,所以这里只给出配置文件写法:
28、xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
ht 29、tp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2. 30、0.xsd">
32、x:advice>
33、ue="com.mysql.jdbc.Driver">
34、ean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
35、ty>
36、续省掉映射文件
40、 hibernate配置 注意不用实体的配置文件用到代理bean是不同的 -->
41、 45、ntity.User
当然并不是不需要映射关联的说明,而是我们用注解的方式来替代映射文件。
User.java
package ch06.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; 46、
import javax.persistence.Id;
import org.hibernate.annotations.Check;
@Entity(name="usertable")
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="uid")
private Integer uid;
@Column(name="username")
private String u 47、sername;
@Column(name="password")
private String password;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = us 48、ername;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
完成上述内容之后,我们可以把hibernate的配置文件和映射文件全都省掉,工程中完全由spring进行管理。
补充:在得到sessionfactory对象时,我们需要为其注入一个数据源(dataSource) ,关于数据源的配置,spring也提供了多种支持方式:
下面的例子中, 49、没有关于hibernate 的内容,只演示不同的数据源获取方式:
User.java
package ch07.entity;
public class User {
private Integer uid;
private String username;
private String password;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
ret






