天天看點

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)