前面介绍了在《非容器环境下如何使用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());
}
*/
}
}
详细见附件源代码。
分享到:
相关推荐
在本文中,我们将深入探讨如何将 Spring 框架与 OpenJPA 结合使用,以及它们各自的核心特性。 首先,理解 Spring 的作用至关重要。Spring 提供了一个全面的编程和配置模型,简化了Java企业级应用的开发。它支持依赖...
Spring MVC和OpenJPA是Java开发中常用的两个框架,它们分别在Web应用和持久层处理上发挥着重要作用。Spring MVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而OpenJPA则是一个实现了Java Persistence ...
**JSF与OpenJPA整合** 涉及到在JSF应用中使用OpenJPA进行数据访问。这通常包括配置OpenJPA的数据源、实体管理器工厂,以及在JSF Managed Beans中注入实体管理器,以便在处理用户请求时执行CRUD操作。JSF的事件驱动...
在“openJpa的应用,感觉还可以”的标题中,我们可以理解到作者对于OpenJPA的使用体验是积极的。OpenJPA提供了诸如实体管理、事务处理、查询优化等核心ORM功能,并且与常见的Java应用服务器如Tomcat、WebLogic等兼容...
这个版本包含了所有必要的组件,使得开发者可以在他们的应用中轻松地集成和使用OpenJPA。以下是一些关键知识点: 1. **实体管理**:OpenJPA支持定义实体类,这些类代表数据库中的表,通过注解或XML配置文件来描述...
这是 《使用 Spring Data JPA 简化 JPA 开发》的sample code。原文在 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html
Spring启动openjpa postgres 这是一个使用openjpa和postgres数据库的spring boot示例应用程序。 该应用程序的主要目的是将JPA实现从Hibernate模式替换为openjpa。 在此示例中,postgres是选择的数据库,但可以轻松地...
在实际开发中,Apache OpenJPA通常与Java EE应用服务器如Tomcat、WildFly等配合使用,结合EJB(Enterprise JavaBeans)或者Spring框架,构建企业级的Web应用。在【压缩包子文件的文件名称列表】中提到的764个文件...
Spring Boot 中使用 JPA 详解 本篇文章主要介绍了在 Spring Boot 中使用 JPA,包括 JPA 的概念、配置、使用流程等方面的知识点。 一、JPA 概念 JPA(Java Persistence API)是一个基于 O/R 映射的标准规范,定义...
Hibernate之外,还有其他实现了JPA规范的框架,比如OpenJPA、TopLink等。开发者可以根据项目需求选择不同的JPA实现,而SpringDataJPA就是在此之上提供了一层抽象,即Repository层的实现,进一步简化了持久层的代码...
在实际使用中,开发者通常会将OpenJPA集成到Spring、Hibernate或EclipseLink等其他框架中,构建完整的持久化层。在`openjpa-master`这个压缩包中,包含的是Apache OpenJPA的源码仓库,开发者可以深入研究其内部实现...
同时,OpenJPA可以与Spring框架和其他开源项目很好地集成,适合大型企业级应用。 **4. JPA批注** JPA批注是定义实体类和其属性与数据库表之间映射的关键部分。常用的批注包括: - `@Entity`:标记一个Java类作为...
为了在项目中使用Spring3.0和JPA,你需要包含以下提及的jar包: 1. **hibernate3.jar**:Hibernate是JPA的一个实现,它是一个流行的ORM框架。此jar包包含了Hibernate的核心库,包括实体管理、查询语言、事务处理等...
在本文中,我们将介绍如何将spring-data-jpa整合到SpringBoot项目中。 首先,需要在pom.xml文件中添加相应的依赖项: ``` <groupId>com.zaxxer</groupId> <artifactId>HikariCP <groupId>mysql <artifactId>...
Apache OpenJPA是Apache软件基金会的Java持久性项目,可以用作独立的POJO持久性层,也可以集成到任何符合Java EE的容器和许多其他轻量级框架中,例如Tomcat和Spring。 1.x发行版是JSR-220 Enterprise Java Beans 3.0...