spring-data-jpa 入门资料
jopen
11年前
使用spring-data-jpa,结合hibernate快速开发
spring-data-jpa 入门资料
- maven环境安装
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.4.3.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Draft-16</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.7.SP1</version> </dependency>spring-data-jpa下载jar会自动依赖包,包括spring framework框架包。
1.4.3.RELEASE依赖包是spring framework的版本是3.14
具体如下:
除此之外,需要手动选择jpa支持的厂商,我这里选择是hibernate。hibernate-jpa-2.1-api是指的jpa的2.1规范,hibernate-entitymanager是jpa的具体实现。
加入数据库驱动包及spring test
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.174</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.1.4.RELEASE</version> <scope>test</scope> </dependency>
最终,pom文件如下:
<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.4.3.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Draft-16</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.7.SP1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.174</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.1.4.RELEASE</version> <scope>test</scope> </dependency> </dependencies>
- 配置
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.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_2_0.xsd"> <persistence-unit name="jpa.sample.plain"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <property name="hibernate.connection.url" value="jdbc:h2:tcp://127.0.0.1:9043/~/test" /> <property name="hibernate.connection.driver_class" value="org.h2.Driver" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="123" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit> </persistence>
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean id="org.h2.tools.Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop"> <constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,9043" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" depends-on="org.h2.tools.Server"> <property name="persistenceUnitName" value="jpa.sample.plain" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> </beans>
在src/main/resources,新建log4j.xml,内容如下:
<?xml version="1.0"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] %m%n" /> </layout> </appender> <root> <priority value="ERROR" /> <appender-ref ref="CONSOLE" /> </root> </log4j:configuration>
- 开发
User类:
package org.springframework.data.jpa.example.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.NamedQuery; import org.springframework.data.jpa.domain.AbstractPersistable; /** * Sample user class. * * @author Oliver Gierke * @author Thomas Darimont */ @Entity @NamedQuery(name = "User.findByTheUsersName", query = "from User u where u.username = ?1") public class User extends AbstractPersistable<Long> { private static final long serialVersionUID = -2952735933715107252L; @Column(unique = true) private String username; private String firstname; private String lastname; public User() { this(null); } /** * Creates a new user instance. */ public User(Long id) { this.setId(id); } /** * Returns the username. * * @return */ public String getUsername() { return username; } /** * @param username the username to set */ public void setUsername(String username) { this.username = username; } /** * @return the firstname */ public String getFirstname() { return firstname; } /** * @param firstname the firstname to set */ public void setFirstname(String firstname) { this.firstname = firstname; } /** * @return the lastname */ public String getLastname() { return lastname; } /** * @param lastname the lastname to set */ public void setLastname(String lastname) { this.lastname = lastname; } }
SimpleUserRepository类:
package org.springframework.data.jpa.example.repository.simple; import java.util.List; import org.springframework.data.jpa.example.domain.User; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; /** * Simple repository interface for {@link User} instances. The interface is used to declare so called query methods, * methods to retrieve single entities or collections of them. * * @author Oliver Gierke * @author Thomas Darimont */ public interface SimpleUserRepository extends CrudRepository<User, Long> { /** * Find the user with the given username. This method will be translated into a query using the * {@link javax.persistence.NamedQuery} annotation at the {@link User} class. * * @param lastname * @return */ User findByTheUsersName(String username); /** * Find all users with the given lastname. This method will be translated into a query by constructing it directly * from the method name as there is no other query declared. * * @param lastname * @return */ List<User> findByLastname(String lastname); /** * Returns all users with the given firstname. This method will be translated into a query using the one declared in * the {@link Query} annotation declared one. * * @param firstname * @return */ @Query("select u from User u where u.firstname = ?") List<User> findByFirstname(String firstname); /** * Returns all users with the given name as first- or lastname. Makes use of the {@link Param} annotation to use named * parameters in queries. This makes the query to method relation much more refactoring safe as the order of the * method parameters is completely irrelevant. * * @param name * @return */ @Query("select u from User u where u.firstname = :name or u.lastname = :name") List<User> findByFirstnameOrLastname(@Param("name") String name); }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa" 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 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <import resource="infrastructure.xml" /> <jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" /> </beans>
- 测试
package org.springframework.data.jpa.example.repository.simple; import static org.junit.Assert.*; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.example.domain.User; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; /** * Intergration test showing the basic usage of {@link SimpleUserRepository}. * * @author Oliver Gierke * @author Thomas Darimont */ @RunWith(SpringJUnit4ClassRunner.class) //@Transactional public abstract class AbstractSimpleUserRepositoryTests { @Autowired SimpleUserRepository repository; User user; @Before public void setUp() { user = new User(); user.setUsername("foobar"); user.setFirstname("firstname"); user.setLastname("lastname"); } @Test public void findSavedUserById() { user = repository.save(user); user = repository.findByTheUsersName("foobar"); // assertEquals(user, repository.findOne(user.getId())); } @Test public void findSavedUserByLastname() throws Exception { // user = repository.save(user); List<User> users = repository.findByLastname("lastname"); // assertNotNull(users); // assertTrue(users.contains(user)); } @Test public void findByFirstnameOrLastname() throws Exception { // user = repository.save(user); List<User> users = repository.findByFirstnameOrLastname("lastname"); // assertTrue(users.contains(user)); } }
XmlConfigSimpleUserRepositoryTests类:
package org.springframework.data.jpa.example.repository.simple; import org.springframework.test.context.ContextConfiguration; /** * @author Thomas Darimont */ @ContextConfiguration(locations = "/simple-repository-context.xml") public class XmlConfigSimpleUserRepositoryTests extends AbstractSimpleUserRepositoryTests {}
- 结果