Hibernate Spring

Появилось немного свободного времени вот решил написать статью как быстро связать 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.zip21.19 кб

Молодец, выкладывай почаще

Молодец, выкладывай почаще

Отправить комментарий

КАПЧА
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Enter the characters shown in the image.