Я читал статью в блоге на днях и решил попробовать код самостоятельно, однако, я хотел сделать это по-своему, поэтому я изменил несколько вещей по пути. В этой статье будет рассказано о том, что я сделал, чтобы NetBeans 7 работал вместе с Spring, Hibernate, HSQLDB, JUnit и Maven. Оригинальный код для оригинальной статьи можно найти здесь .
Я начал свой проект с создания нового проекта Maven под названием SimpleSpringHibernate .
Я добавил следующие зависимости:
Примечание: имейте в виду, что вам действительно нужно добавить Hibernate, Spring Framework, JUnit, HSQLDB, а остальное будет добавлено Maven. Я включил приведенный выше снимок экрана, чтобы показать все, как я его настроил.
Я создал только одну сущность с именем Employee, которая принимает идентификатор , имя и отдел . Он подключен к Hibernate и довольно прост для понимания.
Employee.java
package com.giantflyingsaucer.simplespringhibernate.entity; import javax.persistence.*; import java.io.Serializable; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "Employees") public class Employee implements Serializable { private String employeeId; private String name; private String department; @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") @Column(name = "EmployeeId", nullable=false) public String getEmployeeId() { return this.employeeId; } public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } @Column(name = "Name", nullable=false) public String getEmployeeName() { return this.name; } public void setEmployeeName(String name) { this.name = name; } @Column(name = "Department", nullable=false) public String getEmployeeDepartment() { return this.department; } public void setEmployeeDepartment(String department) { this.department = department; } }
После этого и в соответствии с оригинальной статьей я создал интерфейс для EmployeeDAO .
EmployeeDAO.java
package com.giantflyingsaucer.simplespringhibernate.dao; import java.util.List; import com.giantflyingsaucer.simplespringhibernate.entity.Employee; public interface EmployeeDAO { public void saveEmployee(Employee employee); public List<Employee> getAllEmployees(Employee employee); public Employee getEmployeeById(String employeeId); public void deleteEmployee(Employee employee); }
Фактический код реализации выглядит следующим образом:
EmployeeDAOImpl.java
package com.giantflyingsaucer.simplespringhibernate.dao; import com.giantflyingsaucer.simplespringhibernate.entity.Employee; import java.util.List; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository("EmployeeDAO") @Transactional public class EmployeeDAOImpl implements EmployeeDAO { private HibernateTemplate hibernateTemplate; @Autowired public void setSessionFactory(SessionFactory sessionFactory) { hibernateTemplate = new HibernateTemplate(sessionFactory); } @Transactional(readOnly = false) public void saveEmployee(Employee employee) { hibernateTemplate.saveOrUpdate(employee); } @Transactional(readOnly = false) public void deleteEmployee(Employee employee) { hibernateTemplate.delete(employee); } @SuppressWarnings("unchecked") public List<Employee> getAllEmployees(Employee employee) { return (List<Employee>) hibernateTemplate.find("from " + Employee.class.getName()); } public Employee getEmployeeById(String employeeId) { return hibernateTemplate.get(Employee.class, employeeId); } }
Мой тестовый код JUnit выглядит так:
EmployeeTest.java
package com.giantflyingsaucer.simplespringhibernate; import java.util.List; import org.junit.Test; import org.junit.Assert; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.giantflyingsaucer.simplespringhibernate.dao.*; import com.giantflyingsaucer.simplespringhibernate.entity.Employee; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( { "/app-config.xml" }) public class EmployeeTest { private EmployeeDAO dao; @Autowired public void setDao(EmployeeDAO dao) { this.dao = dao; } @Test public void testCreateData() { int expectedResult = 1; Employee employee = new Employee(); employee.setEmployeeDepartment("Human Resources"); employee.setEmployeeName("Barry Jones"); dao.saveEmployee(employee); Assert.assertEquals(expectedResult, dao.getAllEmployees(new Employee()).size()); } @Test public void testRetrieveData() { List<Employee> employeeList = dao.getAllEmployees(new Employee()); Assert.assertEquals(1, employeeList.size()); Employee employeeExpected = employeeList.get(0); Employee employeeResult = dao.getEmployeeById(employeeExpected.getEmployeeId()); Assert.assertEquals(employeeExpected.getEmployeeId(), employeeResult.getEmployeeId()); } @Test public void testUpdateData() { List<Employee> employeeList = dao.getAllEmployees(new Employee()); Assert.assertEquals(1, employeeList.size()); Employee employeeExpected = employeeList.get(0); employeeExpected.setEmployeeName("Jim Jones"); dao.saveEmployee(employeeExpected); Employee employeeResult = dao.getEmployeeById(employeeExpected.getEmployeeId()); Assert.assertEquals(employeeExpected.getEmployeeName(), employeeResult .getEmployeeName()); } @Test public void testDeleteData() { List<Employee> employeeList = dao.getAllEmployees(new Employee()); Assert.assertEquals(1, employeeList.size()); Employee employeeExpected = employeeList.get(0); dao.deleteEmployee(employeeExpected); Employee employeeResult = dao.getEmployeeById(employeeExpected.getEmployeeId()); Assert.assertEquals(employeeResult, null); } }
Все, что осталось, — это три файла конфигурации, которые нужны в основном Spring. Эти файлы идут в папку ресурсов .
приложение-config.xml
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/configuration.properties</value> </list> </property> </bean> <context:component-scan base-package="com.giantflyingsaucer.simplespringhibernate" /> <import resource="db-config.xml" /> </beans>
дб-config.xml
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>${jdbc.driver.className}</value> </property> <property name="jdbcUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="packagesToScan" value="com.giantflyingsaucer.simplespringhibernate.entity" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop> <prop key="hibernate.hbm2ddl.auto">create-drop</prop> <prop key="hibernate.show_sql">false</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <tx:annotation-driven /> </beans>
Примечание: здесь я использую HSQLDB, но вы можете поменять его для любой из поддерживаемых баз Hibernate.
configuration.properties
jdbc.driver.className=org.hsqldb.jdbcDriver jdbc.url=jdbc:hsqldb:file:consoledb;shutdown=true jdbc.username=sa jdbc.password= jdbc.hibernate.dialect=org.hibernate.dialect.HSQLDialect
Мой макет проекта выглядит так:
Очистите и соберите проект, и все четыре теста должны пройти.
Вы можете найти файлы проекта здесь .