- 在Spring中使用Hibernate時(shí),一般使用HibernateDaoSupport或HibernateTemplate獲得HibernateTemplate對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行CURD的操作。下面分別用這兩種方式做一個(gè)例子。
- 在DAO中注入HibernateDaoSupport類的方式。
-
spring配置文件代碼:
<context:annotation-config/>//開啟注解
<context:component-scan base-package="dao,service"/>//掃描注解的包//使用commons-dbcp2配置一個(gè)數(shù)據(jù)源 <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///hibernate"/> <property name="username" value="root"/> <property name="password" value="java"/> </bean> //配置Hibernate的sessionFactory <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> //配置Hibernate <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.farmat_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> </props> </property> <property name="annotatedClasses" value="model.Student"/>//注解的model類 <property name="dataSource" ref="dataSource"/> </bean> //需要注入的到DAO中的HibernateTemplate <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/ </bean> <tx:annotation-driven/>//開啟事務(wù)注解 <!--把sessionFactory注入到HibernateTransactionManager中、,Hibernate在進(jìn)行CUD時(shí)需要開啟事務(wù),但是我們又不直 接使用Hibernate的session,所以我們需要把Hibernate中的事務(wù)交給spring管理 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> -
DAO繼承HibernateDaoSupport,java代碼:
@Repository
public class StudentDao {
@Autowired
private HibernateTemplate hibernateTemplate;public void save(Student student){ hibernateTemplate.save(student); } } service層代碼:
@Transactional(readOnly=false)
@Service
public class StudentService {
@Autowired
private StudentDao studentDao;
public void save(Student student){
studentDao.save(student);
}
}測試類代碼:
public class Application {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-hibernate.xml");
StudentService service = context.getBean(StudentService.class);
service.save(new Student("月明飛", "nan"));
}
}
DAO繼承HibernateDaoSupport類的方式,和上面幾乎相同,我們只需要在DAO的bean中配置一個(gè)SessionFactory,HibernateDaoSupport可以自動(dòng)為HibernateTemplate賦值,在DAO中使用this.getHibernateTemplate()方法返回一個(gè)HibernateTemplate對(duì)象。這種方式的缺點(diǎn)就是DAO不能再繼承其他的類。
以上的方式貌似是完美的,可是Spring文檔中的Demo卻是使用在DAO中注入SessionFactory的方式----sessionFactory.getCurrentSession()返回一個(gè)session對(duì)象,通過這個(gè)對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行CURD操作。
-
model類代碼:
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int id;@Column(unique=true) public String name; public String sex; public Student(){} public Student(String name, String sex) { super(); this.name = name; this.sex = sex; } 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]"; } }