Появилось немного свободного времени вот решил написать статью как быстро связать 2 технологии Hibernate и Spring. В интернете много примеров но в них постоянно не хватает важных нюансов, или простого, не сложного примера, я не буду делать акцент на подробном изложении примера а только объясню как наиболле просто связать Hibernate и Spring между собой. Итак давайте по порядку расмотрим простой пример.
Пусть у нас есть сушность(Entity) Division:
package net.mine.employeemanager.domain;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "division")
public class Division {
@Id
@Column(name = "ID")
private Integer id;
@Column(name = "NAME")
private String name;
public Division() {
}
....
getter & setter
}
Напишем DAO с 2-мя методами - добавление и получение сушности Division:
1 пишим интерфейс доступа к Entity:
package net.mine.employeemanager.dao;
import net.mine.employeemanager.domain.Division;
import java.util.List;
public interface EmployeeDAO {
public List<Division> listDivision();
public void addDivision(Division division);
}2 реализуем интерфейс доступа к Entity:
package net.mine.employeemanager.dao;
import net.mine.employeemanager.domain.Division;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.hibernate.SessionFactory;
public class EmployeeDAOImpl implements EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional(readOnly=true)
public List<Division> listDivision() {
return sessionFactory.getCurrentSession().createQuery("from Division ").list();
}
@Transactional(readOnly=false)
public void addDivision(Division division) {
getSessionFactory().getCurrentSession().saveOrUpdate(division);
}
}Настраиваем hibernate для работы с БД + spring'om:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- настройка mysql --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">123</property> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.hbm2ddl.auto">create</property>
кто отвечает за сессию
<property name="current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext </property>
кто отвечает за транзакции
<property name="hibernate.transaction.factory_class">org.springframework.orm.hibernate3.SpringTransactionFactory </property>
наша Entity
<mapping class="net.mine.employeemanager.domain.Division"/> </session-factory> </hibernate-configuration>
Далее настраиваем spring + описываем зависимости:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <tx:annotation-driven transaction-manager="transactionManager"/> - подключаем spring-transaction анотации <context:annotation-config /> - подключаем spring анотации
создаем менеджер транзакций
<bean id="transactionManager" scope="singleton" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
создаем фабрику классов для доступа к сессиям hibernate + задействуем аннотации
<bean id="sessionFactory" scope="singleton" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> <property name="configurationClass"> <value>org.hibernate.cfg.AnnotationConfiguration</value> </property> </bean> <!-- A SPRING interceptor that takes care of HIBERNATE session lifecycle. --> <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean>
создаем нашу реализацию EmployeeDAOImpl
<bean name="employeeDAO" scope="prototype" class="net.mine.employeemanager.dao.EmployeeDAOImpl"> </bean> </beans>
пишем очень простой тест:
package net.mine.employeemanager.test;
import net.mine.employeemanager.dao.EmployeeDAO;
import net.mine.employeemanager.domain.Division;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
/**
* Created by IntelliJ IDEA.
* User: lopanov
* Date: 04.03.2011
* Time: 9:15:32
* To change this template use File | Settings | File Templates.
*/
public class TestEmployeeDAOImpl {
public ApplicationContext context;
@Before
public void setUp() {
получаем доступ к spring'y
context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void notNull() {
получаем доступ к spring bean-у
EmployeeDAO employeeDAO =
(EmployeeDAO) context.getBean("employeeDAO");
assertNotNull(":Test employeeDAO is Null", employeeDAO);
}
@Test
public void equals(){
получаем доступ к spring bean-у
EmployeeDAO employeeDAO =
(EmployeeDAO) context.getBean("employeeDAO");
создаем Entity Division
Division d = new Division();
d.setId(1);
d.setName("Test");сохраняем Entity Division - в БД
employeeDAO.addDivision(d);
считываем с БД - поле Id и проверяем совпадает ли сохраненное значение в БД с тем что мы сохранили
//Division d1 = employeeDAO.listDivision().get(0);
assertEquals(":Test employeeDAO is assertEquals falled",d.getId(),employeeDAO.listDivision().get(0).getId());
}
}ну и последний шаг какими библиотеками я пользовался:
- antlr-2.7.6.jar
- cglib-2.2.jar
- commons-collections-3.1.jar
- commons-logging-1.1.jar
- dom4j-1.6.1.jar
- ejb3-persistence.jar
- hibernate-commons-annotations.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- hibernate-validator-4.1.0.Final.jar
- hibernate3.jar
- javassist-3.12.0.GA.jar
- jta-1.1.jar
- junit-4.8.2.jar
- log4j-1.2.15.jar
- log4j.jar
- mysql-connector-java-5.0.0-beta-bin.jar
- slf4j-api-1.6.1.jar
- slf4j-log4j12-1.6.1.jar
- spring.jar
теперь запускаем тест и получаем В БД test таблицу division в ней запись с значением Id=1 Name=test
| Вложение | Размер |
|---|---|
| testSpringHibernate.zip | 21.19 кб |


Молодец, выкладывай почаще
Молодец, выкладывай почаще
Отправить комментарий