目前
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)