spring-data-jpa 入門資料
使用spring-data-jpa,結合hibernate快速開發
spring-data-jpa 入門資料
- maven環境安裝 </ul>
<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> </pre>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> </pre>
- 配置 </ul> 在src/main/resources/META-INF目錄下,新建persistence.xml,內容如下:
<?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
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
;<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> </pre>
在src/main/resources,新建log4j.xml,內容如下:<?xml version="1.0"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns: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> </pre>
- 開發
</ul>
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; } } </pre>
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); } </pre>
加入spring配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="<jpa:repositories base-package="org.springframework.data.jpa.example.repository.simple" />
</beans> </pre>
- 測試
</ul> AbstractSimpleUserRepositoryTests類:
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)); } } </pre>
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 {} </pre>
- 結果
![]()