Статьи

Проект с использованием NetBeans 7, JUnit, Maven, HSQLDB, Spring и Hibernate

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

Мой макет проекта выглядит так:

Очистите и соберите проект, и все четыре теста должны пройти.

Вы можете найти файлы проекта здесь .

 

С http://www.giantflyingsaucer.com/blog/?p=2934#more-2934