简单的Spring JPA实现例子

1. 使用maven创建一个jpa的测试工程

<textarea cols="50" rows="15" name="code" class="java">mvn archetype:create -DgroupId=myjpa -DartifactId=myjpa</textarea> 

2. 添加jpa所依赖的包,这里使用的hibernate的jpa实现,并且使用hsql数据库作为测试数据库

<textarea cols="50" rows="15" name="code" class="xhtml"> &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt; &lt;configuration&gt; &lt;source&gt;1.5&lt;/source&gt; &lt;target&gt;1.5&lt;/target&gt; &lt;/configuration&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;commons-lang&lt;/groupId&gt; &lt;artifactId&gt;commons-lang&lt;/artifactId&gt; &lt;version&gt;2.4&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt; &lt;version&gt;1.5.8&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.slf4j&lt;/groupId&gt; &lt;artifactId&gt;slf4j-jdk14&lt;/artifactId&gt; &lt;version&gt;1.5.8&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;hsqldb&lt;/groupId&gt; &lt;artifactId&gt;hsqldb&lt;/artifactId&gt; &lt;version&gt;1.8.0.7&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring&lt;/artifactId&gt; &lt;version&gt;2.5&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt; &lt;version&gt;3.3.1.GA&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-annotations&lt;/artifactId&gt; &lt;version&gt;3.3.1.GA&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-entitymanager&lt;/artifactId&gt; &lt;version&gt;3.4.0.GA&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;junit&lt;/groupId&gt; &lt;artifactId&gt;junit&lt;/artifactId&gt; &lt;version&gt;4.3.1&lt;/version&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependencies&gt;</textarea> 

3. 创建两个model类

Customer.java

<textarea cols="50" rows="15" name="code" class="c-sharp">package myjpa.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class Customer implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.TABLE) private int id; private String name; private String email; @Temporal(TemporalType.DATE) private Date birthday; @OneToMany(mappedBy = "customer") private final List&lt;Address&gt; addresses = new ArrayList&lt;Address&gt;(); 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&lt;Address&gt; 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); } }</textarea> 

Address.java

<textarea cols="50" rows="15" name="code" class="java">package myjpa.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Address implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.TABLE) private int id; private String name; private String description; private String zipcode; @ManyToOne private Customer customer; 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 getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } @Override public String toString() { return org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(this); } } </textarea> 

4. 创建DAO接口和实现类,这里为了简单,省去了异常处理的代码

CustomerDAO接口如下

<textarea cols="50" rows="15" name="code" class="java">package myjpa.dao; import java.util.List; import myjpa.model.Customer; public interface CustomerDAO { Customer findById(int id); Customer add(Customer customer); List&lt;Customer&gt; list(); }</textarea> 

CustomerDAOJPAImpl实现类如下:

<textarea cols="50" rows="15" name="code" class="java">package myjpa.dao; import java.util.List; import org.springframework.orm.jpa.support.JpaDaoSupport; import myjpa.model.Customer; public class CustomerDAOJPAImpl extends JpaDaoSupport implements CustomerDAO { 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&lt;Customer&gt; list() { List&lt;Customer&gt; customers = getJpaTemplate().find("select c from Customer c"); return customers; } }</textarea> 

 

5. 配置persistence.xml文件

在工程的src/main/resources目录下创建META-INF目录,并在META-INF下创建persistence.xml文件,内容如下:

<textarea cols="50" rows="15" name="code" class="xhtml"> &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt; &lt;persistence-unit name="spring" transaction-type="RESOURCE_LOCAL"&gt; &lt;class&gt;myjpa.model.Customer&lt;/class&gt; &lt;class&gt;myjpa.model.Address&lt;/class&gt; &lt;/persistence-unit&gt; &lt;/persistence&gt;</textarea> 

注意:这里只有实体类的配置,所有关于数据库的配置都放到了spring的配置文件里统一处理。

 

6. 配置spring文件

在工程的src/main/resources目录下创建spring.xml文件,内容如下:

<textarea cols="50" rows="15" name="code" class="xhtml"> &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"&gt; &lt;bean id="customerDAOTarget" class="myjpa.dao.CustomerDAOJPAImpl"&gt; &lt;property name="entityManagerFactory" ref="entityManagerFactory" /&gt; &lt;/bean&gt; &lt;bean id="customerDAO" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; &lt;property name="transactionManager" ref="transactionManager" /&gt; &lt;property name="target" ref="customerDAOTarget" /&gt; &lt;property name="transactionAttributes"&gt; &lt;props&gt; &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;prop key="del*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;prop key="create*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;prop key="add*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; &lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt; &lt;property name="persistenceUnitName" value="spring" /&gt; &lt;property name="dataSource" ref="dataSource" /&gt; &lt;property name="jpaVendorAdapter"&gt; &lt;bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&gt; &lt;property name="showSql" value="false" /&gt; &lt;property name="generateDdl" value="true" /&gt; &lt;property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" /&gt; &lt;/bean&gt; &lt;/property&gt; &lt;property name="loadTimeWeaver"&gt; &lt;bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; &lt;property name="driverClassName" value="org.hsqldb.jdbcDriver" /&gt; &lt;property name="url" value="jdbc:hsqldb:mem:." /&gt; &lt;property name="username" value="sa" /&gt; &lt;property name="password" value="" /&gt; &lt;/bean&gt; &lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt; &lt;property name="entityManagerFactory" ref="entityManagerFactory" /&gt; &lt;property name="dataSource" ref="dataSource" /&gt; &lt;/bean&gt; &lt;/beans&gt;</textarea> 

 

7. 编写测试类,这里简单起见就没有再引入别的数据库测试包,而是使用的CustomerDAO自己的添加和查询方法测试自己,通常情况应该是使用第三方的JDBC测试工具来做这些测试。在src/test/java目录下创建测试类CustomerDAOJPAImplTest

<textarea cols="50" rows="15" name="code" class="java">package myjpa.dao; import java.util.Calendar; import java.util.List; import junit.framework.Assert; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import myjpa.model.Address; import myjpa.model.Customer; public class CustomerDAOJPAImplTest { private static CustomerDAO customerDAO; @BeforeClass public static void setUpBeforeClass() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("/spring.xml"); customerDAO = (CustomerDAO)ctx.getBean("customerDAO"); for (int i = 0; i &lt; 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&lt;Customer&gt; 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&lt;Customer&gt; customers = customerDAO.list(); Assert.assertEquals(true, customers.size() &gt; 0); } }</textarea> 

 

8. 运行测试类,JPA会自动创建所要使用的数据库和表,然后就会执行相应的添加和查询操作,并使用断言来验证测试的正确性。

 

 

 

 

 

 

你可能感兴趣的:(spring,exception,String,jpa,测试,Class)