Я читал статью в блоге на днях и решил попробовать код самостоятельно, однако, я хотел сделать это по-своему, поэтому я изменил несколько вещей по пути. В этой статье будет рассказано о том, что я сделал, чтобы 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
Мой макет проекта выглядит так:
Очистите и соберите проект, и все четыре теста должны пройти.
Вы можете найти файлы проекта здесь .