在Spring中配置使用Java Persistence API(JPA)
1. 配置数据源
首先,在Spring配置文件(applicationContext.xml)中创建一个JNDI数据源,该数据源使用JndiObjectFactoryBean
<bean id="dataSource" destroy-method="close" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/login</value>
</property>
<property name="resourceRef" value="true"/>
</bean>
另外,需要为tomcat做相应的配置。本例中通过配置全局resource,然后通过resourcelink来映射到数据源。
在$TOMCAT_HOME/conf/server.xml的GlobalNamingResources部分添加一个新的数据源,指定JDBC连接方式,配置如下:
<GlobalNamingResources>
<!-- other data source -->
<Resource
name="jdbc/login"
type="javax.sql.DataSource"
maxActive="4"
maxIdle="2"
maxWait="5000"
driverClassName="com.mysql.jdbc.Driver"
username="root"
password=""
url="jdbc:mysql://localhost:3306/login" />
</GlobalNamingResources>
在$TOMCAT_HOME/conf/context.xml中配置resourcelink:
<Context>
<ResourceLink name="jdbc/login" type="javax.sql.DataSource" global="jdbc/login"/>
</Context>
注意,context中的name要和resource中的name一致。
2. 配置entityManagerFactory
在spring配置文件中申明一个entityManagerFactory bean来提供JPA EntityManager。该EntityManager提供对数据库的操作。另外还需要指定jpaVendorAdapter来告诉Spring,我们将使用Hibernanate来作为JPA实现的提供者。
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="default"/>
<property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
</bean>
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true"/>
</bean>
3. 定义持久化单元
在上面的配置中,我们指定了EntityManager所使用的持久化单元为“default”,我们需要创建一个persistence.xml来定义该持久化单元。该文件必须出现在该应用的classpath中,这样该文件才能被JPA的实现提供者(本例中为Hibernate)找到。我们将该文件保存在 src/main/resources/META-INF下。
<persistence 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"
version="1.0">
<persistence-unitname="default" transaction-type="RESOURCE_LOCAL">
<class>login.User</class>
<properties>
<propertyname="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
</persistence>
这里要注意,根据后台数据库的不同使用正确的dialect,本文以mysql为例。对于sqlserver要做相应的修改:
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
4. 代码实现
在Spring配置文件中配置PersistenceAnnotationBeanPostProcessor,以使Spring能识别JPA的annotation。
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
定义Java实体类,使用JPA的annotation标记:
@Entity
@Table(name = "UserTable")
public class User implements Serializable {
private static final long serialVersionUID = -2680510247379883696L;
@Id
@Generated Value(strategy = GenerationType.AUTO)
private int id;
private String username;
public int getId() {
returnthis.id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
}
在持久层中使用JPA实现对数据库的访问,使用JPQL (Java Persistence Query Language)来查询数据库:
@PersistenceContext
private EntityManager entityManager;
public User getUserByUsername(String username) {
Query query = this.getEntityManager().createQuery("select user from login.User user where user.username like :username");
query.setParameter("username", username);
return (User) query.getSingleResult();
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public EntityManager getEntityManager() {
returnentityManager;
}