ORM(object-relational mapping)——对象/关系 映射。
Spring对多个ORM框架提供了支持。下面分别介绍Spring对Hibernate和JPA(Java持久化API,java Persistence API)的支持。
maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
1.在Spring中集成Hibernate
1.1声明Hibernate的Session工厂
使用Hibernate所需的主要接口是org.hibernate.Session。Session接口提供了基本的数据访问功能。获取Hibernate Session对象的标准方式是借助于Hibernate Session Factory接口的实现类。SessionFactory主要负责Hibernate Session的打开、关闭以及管理。
从3.1版本开始,Spring提供了三个Session工厂bean供我们选择:
- org.springframework.orm.hibernate3.LocalSessionFactoryBean
- org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
- org.springframework.orm.hibernate4.LocalSessionFactoryBean
至于选择哪一个Session工厂,取决于使用哪一个版本的Hibernate以及使用XML还是使用注解定义对象-数据库之间的映射关系。XML——LocalSessionFactoryBean
,注解——AnnotationSessionFactoryBean。
org.springframework.orm.hibernate4.LocalSessionFactoryBean
类似于前俩个的结合体,能够支持基于XML的映射和基于注解的映射。
/**
* org.springframework.orm.hibernate3.LocalSessionFactoryBean
* @param dataSource
* @return
*/
@Bean
@Autowired
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setDataSource(dataSource);
sfb.setMappingResources(new String[] {
"test.hnm.xml"});//设置Hibernate映射文件
Properties prop = new Properties();
prop.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
sfb.setHibernateProperties(prop);
return sfb;
}
/**
* org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
* @param dataSource
* @return
*/
@Bean
@Autowired
public AnnotationSessionFactoryBean sessionFactory(DataSource dataSource){
AnnotationSessionFactoryBean bean = new AnnotationSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setPackagesToScan(new String[] {
"com.sh.domin"});
Properties prop = new Properties();
prop.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
bean.setHibernateProperties(prop);
return bean;
}
/**
* org.springframework.orm.hibernate4.LocalSessionFactoryBean
* 基于注解的方式
* @param dataSource
* @return
*/
@Bean
@Autowired
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setDataSource(dataSource);
//使用PackagesToScan属性告诉Spring要扫描一个或多个包以查找域类,这些类通过主机的方式表明
//要使用Hibernate进行持久化,这些类可以使用的注解包括JPA的@Entity或@MappedSuperclass以及Hibernate的@Entity。
sfb.setPackagesToScan(new String[] {
"com.sh.domin"});
Properties properties = new Properties();
properties.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
sfb.setHibernateProperties(properties);
return sfb;
}
1.2构建不依赖于Spring 的hibernate代码
使用上下文Session.
@Repository
public class HibernateRepository {
@Autowired
private SessionFactory sessionFactory;//注入SessionFactory
public Session currentSession(){
return sessionFactory.getCurrentSession();//从SessionFactory众获取当前Session
}
@Transactional
public List<User> list(){
//使用当前Session查询user表中的所有数据方法list集合中
return (List<User>)currentSession().createCriteria(User.class).list();
}
}
实体User:
@Entity()
@Table(name="user")
public class User implements Serializable {
private static final long serialVersionUID = -4869287368065710953L;
@Id
private int id;
private String username;
private String password;
private int sex;
@Column(name="id",nullable=false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column