天天看点

Spring5:整合Hibernate(纯注解配置方式)

当前

Spring5.3.0,Hibernate5.4.3.Final

1.声明

当前内容主要为使用Spring整合当前的Hibernate,使用注解方式实现操作

2.demo

由于是纯注解方式,所以没有applicationContext.xml配置文件

AppConfig.java
import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = { "com.hy.java.spring.database.hibernate.anno.service" })
@PropertySource(value = { "classpath:/com/hy/java/spring/database/hibernate/anno/db.properties" })
public class AppConfig {
	@Value("${jdbc.driverClassName}")
	private String driverClassName;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;

	@Bean
	public DataSource dataSource() {
		BasicDataSource basicDataSource = new BasicDataSource();
		basicDataSource.setUrl(url);
		basicDataSource.setDriverClassName(driverClassName);
		basicDataSource.setUsername(username);
		basicDataSource.setPassword(password);
		return basicDataSource;
	}

	// 配置sessionFactory
	@Bean(name = "sessionFactory")
	public SessionFactory getSessionFactory(@Autowired DataSource dataSource) {
		LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
		sessionFactoryBean.setDataSource(dataSource);
		Properties hibernateProperties = new Properties();
		hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
		hibernateProperties.setProperty("hibernate.show_sql", "true");
		hibernateProperties.setProperty("hibernate.format_sql", "true");
		sessionFactoryBean.setHibernateProperties(hibernateProperties);
		// 扫描带有注解的实体类的包
		sessionFactoryBean.setPackagesToScan("com.hy.java.spring.database.hibernate.anno.entity");
		try {
			sessionFactoryBean.afterPropertiesSet();// 一定要加这句话,通过查看源码得知:调用afterPropertiesSet()方法://在这里开始生成一个真正的SessionFactory对象;然后利用getObjecy生成出来
			// 如果没有这个方法就不能产生sessionFactory对象,就不能通过getObject()方法获得新创建的对象sessionFactory
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sessionFactoryBean.getObject();
	}

	// 配置事务
	@Bean(name = "txManager")
	public HibernateTransactionManager getTransactionManager(@Autowired DataSource dataSource,@Autowired SessionFactory sessionFactory) {
		HibernateTransactionManager transactionManager = new HibernateTransactionManager();
		transactionManager.setDataSource(dataSource);
		transactionManager.setSessionFactory(sessionFactory);
		return transactionManager;
	}

	// 配置hibernateTemplate
	/*
	 * @Bean(name = "hibernateTemplate") public HibernateTemplate
	 * getHibernateTemplate() { HibernateTemplate hibernateTemplate = new
	 * HibernateTemplate(getSessionFactory()); return hibernateTemplate; }
	 */
}

           

这个里面就是核心配置操作,主要对应xml配置文件中的内容

实体类:User.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user")
public class User {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@Column(nullable = true, name = "name")
	private String name;

	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;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}

}

           

其中的注解全是javax的包中的注解

UserService.java
import java.util.Collection;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.hy.java.spring.database.hibernate.anno.entity.User;

@Service("userService")
public class UserService {
	
	@Autowired
	private SessionFactory sessionFactory;

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	// 使用当前的实体查询方式
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public List getUserByUserName(String name) {
		return this.sessionFactory.getCurrentSession().createQuery("from User u where u.name=?0").setParameter(0, name)
				.list();
	}

	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	// 使用原生的sql查询方式
	public List<User> getAllUsers() {
		return this.sessionFactory.getCurrentSession().createSQLQuery("select * from user").addEntity(User.class)
				.list();
	}
}

           
测试类
/**
 * @description 使用注解方式整合当前的Spring和Hibernate
 * @author admin
 *
 */
public class HibernateAnnotationTest {
	public static void main(String[] args) {
		ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
		UserService userService = context.getBean(UserService.class);
		Collection loadUserByUserName = userService.getUserByUserName("admin");
		System.out.println(loadUserByUserName);
		List<User> allUsers = userService.getAllUsers();
		System.out.println(allUsers);
	}
}
           

测试结果成功!,

和xml配置的方式完全一样,甚至可以直接整合到Web项目中实现SSH项目(Spring、SpringMVC、Hibernate5)