`
lxy19791111
  • 浏览: 480887 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Spring中使用OpenJPA

    博客分类:
  • JPA
阅读更多

     前面介绍了在《非容器环境下如何使用OpenJPA》,现在我们来看一下它如何与现在流行的Spring框架集成的问题,包括事务的处理。

  1.修改AniamlDAOImpl.java

package com.openjpa.dao.impl;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;

import com.openjpa.dao.AnimalDAO;
import com.openjpa.entity.Animal;

/**
 * AnimalDAOImpl 演示了如何使用OpenJPA访问数据库的方法和步骤
 * 
 * @author king
 * 
 */
public class AnimalDAOImpl extends JpaDaoSupport implements AnimalDAO {
	
	/**
	 * removeAnimal方法可以从数据库中删除指定编号的Animal对象
	 * 
	 * @param id
	 *            Animal对象的编号
	 */
	public void removeAnimal(final int id) {		

		// 使用Query删除对象
		getJpaTemplate().execute(new JpaCallback(){

			public Object doInJpa(EntityManager em) throws PersistenceException {				
				em.createQuery("delete from Animal animal where animal.id=" + id).executeUpdate();
				return null;
			}			
			
		});
		
	}

	/**
	 * findAnimalsByName 通过输入的name内容模糊查找符合条件的Animal对象列表
	 * 
	 * @param name
	 *            Animal对象的name
	 * @return 符合模糊查找条件的Animal对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<Animal> findAnimalsByName(final String name) {
		
		
		return (List<Animal>) getJpaTemplate().execute(new JpaCallback(){

			public Object doInJpa(EntityManager em) throws PersistenceException {
				/*
				 * 通过EntityManager的createQuery方法获取Query对象
				 * createQuery方法的参数是JPQL查询语句,JPQL语句的语法请参考OpenJPA的帮助文档.
				 * 
				 * 由于查询不需要事务的支持,因此Query操作的前后没有出现begin、commit方法的调用
				 * 
				 */
				Query q = em.createQuery("select animal from Animal animal where animal.name like :name");
				q.setParameter("name", "%" + name + "%");
				
				return q.getResultList();
			}
		});
	}

	/**
	 * getAnimalByPrimaryKey 方法可以查找符合条件的单个Animal对象,如果不存在对应的Animal对象将返回null
	 * 
	 * @param id
	 *            Animal对象的编号
	 * @return 唯一符合条件的Animal对象
	 * 
	 */
	public Animal getAnimalByPrimaryKey(final int id) {
		
		return (Animal) getJpaTemplate().find(Animal.class, id);
	}

	/**
	 * 将对象持久化到数据库中
	 * 
	 * @param animal
	 *            需要被持久化的对象
	 */
	public void persistAnimal(final Animal animal) {
		
		getJpaTemplate().persist(animal);
	}

	public void updateAnimal(final Animal animal) {
		
		getJpaTemplate().merge(animal);
	}

}

 2.增加AnimalService.java和AnimalServiceImpl.java:

package com.openjpa.service;

import java.util.List;

import com.openjpa.entity.Animal;

public interface AnimalService {

	
	/**
	 * removeAnimal方法可以从数据库中删除指定编号的Animal对象
	 * 
	 * @param id
	 *            Animal对象的编号
	 */
	public void removeAnimal(final int id) ;

	/**
	 * findAnimalsByName 通过输入的name内容模糊查找符合条件的Animal对象列表
	 * 
	 * @param name
	 *            Animal对象的name
	 * @return 符合模糊查找条件的Animal对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<Animal> findAnimalsByName(final String name) ;

	/**
	 * getAnimalByPrimaryKey 方法可以查找符合条件的单个Animal对象,如果不存在对应的Animal对象将返回null
	 * 
	 * @param id
	 *            Animal对象的编号
	 * @return 唯一符合条件的Animal对象
	 * 
	 */
	public Animal getAnimalByPrimaryKey(final int id);
	
	/**
	 * 将对象持久化到数据库中
	 * 
	 * @param animal
	 *            需要被持久化的对象
	 */
	public void persistAnimal(final Animal animal);

	public void updateAnimal(final Animal animal);

}
package com.openjpa.service.impl;

import java.util.List;

import com.openjpa.dao.AnimalDAO;
import com.openjpa.entity.Animal;
import com.openjpa.service.AnimalService;

public class AnimalServiceImpl implements AnimalService {

	private AnimalDAO animalDao;
	
	/**
	 * removeAnimal方法可以从数据库中删除指定编号的Animal对象
	 * 
	 * @param id
	 *            Animal对象的编号
	 */
	public void removeAnimal(final int id){
		
		animalDao.removeAnimal(id);
	}

	/**
	 * findAnimalsByName 通过输入的name内容模糊查找符合条件的Animal对象列表
	 * 
	 * @param name
	 *            Animal对象的name
	 * @return 符合模糊查找条件的Animal对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<Animal> findAnimalsByName(final String name){

		return animalDao.findAnimalsByName(name);
	}

	/**
	 * getAnimalByPrimaryKey 方法可以查找符合条件的单个Animal对象,如果不存在对应的Animal对象将返回null
	 * 
	 * @param id
	 *            Animal对象的编号
	 * @return 唯一符合条件的Animal对象
	 * 
	 */
	public Animal getAnimalByPrimaryKey(final int id){
		
		return animalDao.getAnimalByPrimaryKey(id);
	}
	
	/**
	 * 将对象持久化到数据库中
	 * 
	 * @param animal
	 *            需要被持久化的对象
	 */
	public void persistAnimal(final Animal animal){
		
		animalDao.persistAnimal(animal);
	}

	public void updateAnimal(final Animal animal){
		
		animalDao.updateAnimal(animal);
	}

	public AnimalDAO getAnimalDao() {
		return animalDao;
	}

	public void setAnimalDao(AnimalDAO animalDao) {
		this.animalDao = animalDao;
	}

}

 3.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-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

   <bean id="animalDao" class="com.openjpa.dao.impl.AnimalDAOImpl">
      <property name="entityManagerFactory" ref="entityManagerFactory"/>
   </bean>
   
   <bean id="animalService" class="com.openjpa.service.impl.AnimalServiceImpl">
      <property name="animalDao" ref="animalDao"/>
   </bean>

   <bean id="entityManagerFactory" 
   	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.OracleDictionary"/>
         </bean>
      </property>
      <property name="loadTimeWeaver">
         <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver"/>
      </property>
   </bean>

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource"	lazy-init="true">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:test" />
		<property name="username" value="test" />
		<property name="password" value="test" />
	</bean>

   <bean id="transactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager" lazy-init="true">
      <property name="entityManagerFactory" ref="entityManagerFactory"/>
   </bean>
   
   	<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="read*" read-only="true" />
			<tx:method name="list*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="load*" read-only="true" />
			<tx:method name="doquery" read-only="true" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="businessService"
			expression="execution(* com.openjpa.service.*.*(..))" />
		<aop:advisor advice-ref="transactionAdvice"
			pointcut-ref="businessService" />
	</aop:config>
	
</beans>

 4.persistence.xml修改:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="1.0">
    <persistence-unit name="oracle" transaction-type="RESOURCE_LOCAL"/>
</persistence>

 5.测试代码TestService.java:

package test.openjpa;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.openjpa.entity.Animal;
import com.openjpa.service.AnimalService;

public class TestService {
	
	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext4App.xml");
		AnimalService animalService = (AnimalService) ctx.getBean("animalService");
		
		//新增
		Animal a = new Animal();
		a.setName("孔雀");
		animalService.persistAnimal(a);
		
		/*
		//查询
		List<Animal> animals = animalService.findAnimalsByName("open");
		for(Animal animal: animals){
			System.out.println("name = " + animal.getName());
		}
		
		//查询单个
		Animal an = animalService.getAnimalByPrimaryKey(a.getId());
		if(an != null){
			System.out.println("Aniaml id = " + a.getId() + " , name = " + an.getName());
		}
		
		
		//删除
		//animalService.removeAnimal(a.getId());
		
		//查询
		animals = animalService.findAnimalsByName("open");
		for(Animal animal: animals){
			System.out.println("name = " + animal.getName());
		}
		*/
	}

}

 详细见附件源代码。

分享到:
评论
6 楼 javawarm_2008 2011-12-06  
楼主,麻烦您帮我看下这个异常:
org.springframework.orm.jpa.JpaSystemException: nested exception is <openjpa-1.2.2-r422266:898935 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null
加上事务就会报这个错误
5 楼 valentina 2011-11-22  
很好很强大!
在没有数据库表的情况下还可以自动创建表:
19534  oracle  TRACE  [main] openjpa.jdbc.SQL - <t 33307780, conn 25515818> executing stmnt 13198090 CREATE SEQUENCE SEQ_ANIMAL START WITH 1 CACHE 50
24137  oracle  TRACE  [main] openjpa.jdbc.SQL - <t 33307780, conn 8886368> executing stmnt 18721294 CREATE TABLE Animal (id NUMBER NOT NULL, name VARCHAR2(255), PRIMARY KEY (id))
能够正常运行,不过jar包稍微调整了一下,使用persistence.jar包替换了j2ee,jta几个包。

另外还有一个问题,persistence.xml配置文件中,transaction-type的属性值还可以使用JTA模式,这种情况应该如何配置?
4 楼 xanodu 2011-10-28  
xanodu 写道
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is <openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
entity.Animal


这个问题一般是什么原因?
3 楼 xanodu 2011-10-28  
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is <openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: "
entity.Animal

2 楼 yueritian 2009-06-10  
return (List<Animal>) getJpaTemplate().execute(new JpaCallback(){   ....


请问为什么要这样写呢?
不是有这个吗?
this.getJpaTemplate().getEntityManager()
1 楼 deerball 2009-02-11  
你好,我下载了你的OpenJPAExamples_spring源代码,并进行了部署,可运行TestService,执行

Animal an = animalService.getAnimalByPrimaryKey(a.getId());

时log里会增加一条select

SELECT t0.name FROM Animal t0 WHERE t0.id = ?  optimize for 1 row [params=(int) 1]

和一条update语句

UPDATE Animal SET name = ? WHERE id = ? [params=(String) 孔雀, (int) 1]

我用的是spring 2.5.5, openjpa 1.2.0。不知道你的环境都是什么样的,是否也会出现这个不该出现的update语句呢?谢谢

相关推荐

    Spring和openJPA集成

    在本文中,我们将深入探讨如何将 Spring 框架与 OpenJPA 结合使用,以及它们各自的核心特性。 首先,理解 Spring 的作用至关重要。Spring 提供了一个全面的编程和配置模型,简化了Java企业级应用的开发。它支持依赖...

    Spring MVC+OpenJPA框架

    Spring MVC和OpenJPA是Java开发中常用的两个框架,它们分别在Web应用和持久层处理上发挥着重要作用。Spring MVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而OpenJPA则是一个实现了Java Persistence ...

    jsf、openJpa学习

    **JSF与OpenJPA整合** 涉及到在JSF应用中使用OpenJPA进行数据访问。这通常包括配置OpenJPA的数据源、实体管理器工厂,以及在JSF Managed Beans中注入实体管理器,以便在处理用户请求时执行CRUD操作。JSF的事件驱动...

    openJpa的应用,感觉还可以

    在“openJpa的应用,感觉还可以”的标题中,我们可以理解到作者对于OpenJPA的使用体验是积极的。OpenJPA提供了诸如实体管理、事务处理、查询优化等核心ORM功能,并且与常见的Java应用服务器如Tomcat、WebLogic等兼容...

    openjpa jar

    这个版本包含了所有必要的组件,使得开发者可以在他们的应用中轻松地集成和使用OpenJPA。以下是一些关键知识点: 1. **实体管理**:OpenJPA支持定义实体类,这些类代表数据库中的表,通过注解或XML配置文件来描述...

    使用 Spring Data JPA 简化 JPA 开发 sample code

    这是 《使用 Spring Data JPA 简化 JPA 开发》的sample code。原文在 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html

    spring-boot-openjpa-postgres

    Spring启动openjpa postgres 这是一个使用openjpa和postgres数据库的spring boot示例应用程序。 该应用程序的主要目的是将JPA实现从Hibernate模式替换为openjpa。 在此示例中,postgres是选择的数据库,但可以轻松地...

    Apache OpenJPA.zip

    在实际开发中,Apache OpenJPA通常与Java EE应用服务器如Tomcat、WildFly等配合使用,结合EJB(Enterprise JavaBeans)或者Spring框架,构建企业级的Web应用。在【压缩包子文件的文件名称列表】中提到的764个文件...

    详解在Spring Boot中使用JPA

    Spring Boot 中使用 JPA 详解 本篇文章主要介绍了在 Spring Boot 中使用 JPA,包括 JPA 的概念、配置、使用流程等方面的知识点。 一、JPA 概念 JPA(Java Persistence API)是一个基于 O/R 映射的标准规范,定义...

    springdatajpa.pdf

    Hibernate之外,还有其他实现了JPA规范的框架,比如OpenJPA、TopLink等。开发者可以根据项目需求选择不同的JPA实现,而SpringDataJPA就是在此之上提供了一层抽象,即Repository层的实现,进一步简化了持久层的代码...

    Apache OpenJPA是Jakarta Persistence API 3.0规范的实现

    在实际使用中,开发者通常会将OpenJPA集成到Spring、Hibernate或EclipseLink等其他框架中,构建完整的持久化层。在`openjpa-master`这个压缩包中,包含的是Apache OpenJPA的源码仓库,开发者可以深入研究其内部实现...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    同时,OpenJPA可以与Spring框架和其他开源项目很好地集成,适合大型企业级应用。 **4. JPA批注** JPA批注是定义实体类和其属性与数据库表之间映射的关键部分。常用的批注包括: - `@Entity`:标记一个Java类作为...

    spring3.0 + jpa 需要的jar包

    为了在项目中使用Spring3.0和JPA,你需要包含以下提及的jar包: 1. **hibernate3.jar**:Hibernate是JPA的一个实现,它是一个流行的ORM框架。此jar包包含了Hibernate的核心库,包括实体管理、查询语言、事务处理等...

    SpringBoot整合spring-data-jpa的方法

    在本文中,我们将介绍如何将spring-data-jpa整合到SpringBoot项目中。 首先,需要在pom.xml文件中添加相应的依赖项: ``` &lt;groupId&gt;com.zaxxer&lt;/groupId&gt; &lt;artifactId&gt;HikariCP &lt;groupId&gt;mysql &lt;artifactId&gt;...

    openjpa

    Apache OpenJPA是Apache软件基金会的Java持久性项目,可以用作独立的POJO持久性层,也可以集成到任何符合Java EE的容器和许多其他轻量级框架中,例如Tomcat和Spring。 1.x发行版是JSR-220 Enterprise Java Beans 3.0...

Global site tag (gtag.js) - Google Analytics