1. 使用maven创建一个jpa的测试工程
2. 添加jpa所依赖的包,这里使用的hibernate的jpa实现,并且使用hsql数据库作为测试数据库
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.1.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.1.GA</version>
</dependency>
<dependency>
<groupId>hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependencies>
3. 创建两个model类
Customer.java
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public List<Address> getAddresses() {
return addresses;
}
public void addAddress(Address address) {
this.addresses.add(address);
address.setCustomer(this);
}
@Override
public String toString() {
return org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(this);
}
}
Address.java
4. 创建DAO接口和实现类,这里为了简单,省去了异常处理的代码
CustomerDAO接口如下
Customer findById(int id);
Customer add(Customer customer);
List<Customer> list();
}
CustomerDAOJPAImpl实现类如下:
public Customer findById(int id) {
return getJpaTemplate().find(Customer.class, id);
}
public Customer add(Customer customer) {
getJpaTemplate().persist(customer);
return getJpaTemplate().find(Customer.class, customer.getId());
}
@SuppressWarnings("unchecked")
public List<Customer> list() {
List<Customer> customers = getJpaTemplate().find("select c from Customer c");
return customers;
}
}
5. 配置persistence.xml文件
在工程的src/main/resources目录下创建META-INF目录,并在META-INF下创建persistence.xml文件,内容如下:
注意:这里只有实体类的配置,所有关于数据库的配置都放到了spring的配置文件里统一处理。
6. 配置spring文件
在工程的src/main/resources目录下创建spring.xml文件,内容如下:
7. 编写测试类,这里简单起见就没有再引入别的数据库测试包,而是使用的CustomerDAO自己的添加和查询方法测试自己,通常情况应该是使用第三方的JDBC测试工具来做这些测试。在src/test/java目录下创建测试类CustomerDAOJPAImplTest
@BeforeClass
public static void setUpBeforeClass() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/spring.xml");
customerDAO = (CustomerDAO)ctx.getBean("customerDAO");
for (int i = 0; i < 10; i++) {
Customer customer = new Customer();
customer.setName("customer_" + i);
customer.setEmail("customer_" + i + "@my.com");
customer.setBirthday(Calendar.getInstance().getTime());
Address addressHome = new Address();
addressHome.setName("Home");
addressHome.setDescription("Home");
addressHome.setZipcode("123456");
Address addressOffice = new Address();
addressOffice.setName("Office");
addressOffice.setDescription("Office");
addressOffice.setZipcode("654321");
customer.addAddress(addressHome);
customer.addAddress(addressOffice);
customerDAO.add(customer);
}
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testFindById() {
List<Customer> customers = customerDAO.list();
for (Customer customer : customers) {
Customer anotherCustomer = customerDAO.findById(customer.getId());
Assert.assertNotNull(anotherCustomer);
Assert.assertEquals(customer.getId(), anotherCustomer.getId());
Assert.assertEquals(customer.getName(), anotherCustomer.getName());
}
}
@Test
public void testAdd() {
Customer customer = new Customer();
customer.setName("customer_abc");
customer.setEmail("customer_abc" + "@my.com");
customer.setBirthday(Calendar.getInstance().getTime());
Address addressHome = new Address();
addressHome.setName("Home");
addressHome.setDescription("Home");
addressHome.setZipcode("123456");
Address addressOffice = new Address();
addressOffice.setName("Office");
addressOffice.setDescription("Office");
addressOffice.setZipcode("654321");
customer.addAddress(addressHome);
customer.addAddress(addressOffice);
Customer persistedCustomer = customerDAO.add(customer);
Assert.assertNotNull(customer);
Assert.assertEquals(customer.getName(), persistedCustomer.getName());
}
@Test
public void testList() {
List<Customer> customers = customerDAO.list();
Assert.assertEquals(true, customers.size() > 0);
}
}
8. 运行测试类,JPA会自动创建所要使用的数据库和表,然后就会执行相应的添加和查询操作,并使用断言来验证测试的正确性。