SayNothing
人才
不清楚
我的首页
文章
相册
圈子
留言
管理
 
    当前所在页面:首页>>文章>>学习与分享JPA(二)
学习与分享JPA(二)
    作者:CodeSmith 来源: 发表时间:2008-01-11

 
 

       Spring中提供了很多对于JPA的支持类,而且提供了一些额外的特性。下面让我们来看一下究竟有些什么?

       首先我们要认识的是LocalEntityManagerFactoryBean类,它是一个遵循JPA的自引导协议,能够在Spring容器启动时创建JPA EntityManagerFactoryFactoryBean,它通过读取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类,我们只需要扩展它就可以获得相应的支持了,并且通过设置JpaTemplateentityManagerentityManagerFactory属性来创建 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,今天先写到这里,继续研究中。。。

 
 

(阅读 )   评论数(:2)
评论】 【收藏】
评论:共2条
this.getJpaTemplate().persist(user); JPA的这个方法不是很好,在持久化的时候建议使用merge()
评论人: erikchang     评论时间: 2008-01-12 13:38:44
persist在一般情况下用来做保存是很合适的。
评论人: 匿名用户     评论时间: 2008-01-18 09:37:53

发表评论:
发表人:
评论: 
    
 
关于我们 | 诚聘英才 | 联系我们 | 广告业务 | 网站地图 | 法律声明

EasyJF开源团队版权所有  建议使用1024*768分辨率