Spring中提供了很多对于JPA的支持类,而且提供了一些额外的特性。下面让我们来看一下究竟有些什么?
首先我们要认识的是LocalEntityManagerFactoryBean类,它是一个遵循JPA的自引导协议,能够在Spring容器启动时创建JPA EntityManagerFactory的FactoryBean,它通过读取persistence.xml JPA的配置信息,并根据JPA的自引导协议启动JPA。
Spring提供了org.springframework.orm.jpaJpaTemplate模板类,它拥有多个EntityManager接口方法的代理方法,大部分的数据访问操作都可以通过这些方法来完成,JpaTemplate会对EntityManager进行代理,以便添加绑定事物、屏蔽close()方法、应用事务的过期设置等功能。
下面来使用JpaTemplate编写数据访问类,首先建立域对象
package com.test.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;// 主键
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
相应的业务接口
package com.test.service;
import com.test.domain.User;
public interface Test {
void addUser(User user);
}
Spring由于提供了JpaDaoSupport类,我们只需要扩展它就可以获得相应的支持了,并且通过设置JpaTemplate的entityManager或entityManagerFactory属性来创建 JpaTemplate实例。
package com.test.service.impl;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import com.test.domain.User;
import com.test.service.Test;
public class TemplateTest extends JpaDaoSupport implements Test {
public void addUser(User user) {
this.getJpaTemplate().persist(user);
}
}
现在我们就可以通过父类JpaDaoSupport中的getJpaTemplate()方法获取实例了。下面就需要写Spring的配置文件了。
<?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.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="app-unit"/>
</bean>
<bean id="test"
class="com.test.service.impl.TemplateTest">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
</beans>
LocalEntityManagerFactoryBean并没有提供JPA任何的配制信息,它仅提供了一个持久化单元名称,所有的环境信息都在persistence.xml文件中提供.,这是使用hibernate的配置
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="app-unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/sampledb?createDatabaseIfNotExist=true" />
<property name="hibernate.connection.username " value="root" />
<property name="hibernate.connection.password " value="admin" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
persistence-util元素定义了持久化单元为app-unit,其中属性transaction-type定义为本地事务,如果设置为JTA则表示全局事务,由于JTA事务需要容器支持,由于使用的是LocalEntityManagerFactoryBean所以不能使用JTA事务。
下面写个测试类进行测试
package com.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.domain.User;
import com.test.service.Test;
public class MyTest {
public static void main(String[] args) {
String[] path=new String[]{"classpath:application.xml"};
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext(path);
Test t = (Test)ctx.getBean("test");
User user=new User();
// user.setId(new Long(1));
user.setUsername("admin");
user.setPassword("admin");
t.addUser(user);
}
}
OK,今天先写到这里,继续研究中。。。