jpa与spring整合
2016-07-20 15:52
381 查看
1:在Pom.xml中引入Spring框架
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dfrz</groupId>
<artifactId>Jpa_02</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>Jpa_02</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<spring.version>4.2.6.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>com.driver</groupId>
<artifactId>sqlserver</artifactId>
<version>2005</version>
</dependency>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-all</artifactId>
<version>2.2.0</version>
</dependency>
<!--引入Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
2:Spring整合
Jpa:EntityManagerFactory---->EntityManagerHibernate:SessionFactory---->Session
3:applicationContext.xml的配置
<?xmlversion="1.0"
encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<context:annotation-config></context:annotation-config>
<context:component-scan
base-package="com.test"></context:component-scan>
<!-- 定义一个数据源 -->
<bean
name="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property
name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property
name="url"
value="jdbc:sqlserver://127.0.0.1:1433;databaseName=Java1503">
</property>
<property
name="username"
value="sa"></property>
<property
name="password"
value=""></property>
</bean>
<bean
name="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property
name="persistenceProviderClass"
value="org.apache.openjpa.persistence.PersistenceProviderImpl">
</property>
<property
name="packagesToScan"
value="com.jpa.entity">
</property>
<property
name="jpaProperties">
<props>
<prop
key="javax.persistence.jdbc.driver">
com.microsoft.sqlserver.jdbc.SQLServerDriver
</prop>
<prop
key="javax.persistence.jdbc.url">
jdbc:sqlserver://localhost:1433;DatabaseName=java1411;SelectMethod=cursor;
</prop>
<prop
key="javax.persistence.jdbc.user">sa</prop>
<prop
key="javax.persistence.jdbc.password"></prop>
<prop
key="openjpa.jdbc.SynchronizeMappings">
buildSchema(ForeignKeys=true)
</prop>
<prop
key="openjpa.Log">SQL=TRACE</prop>
<prop
key="openjpa.ConnectionFactoryProperties">
PrettyPrint=true,PrettyPrintLineLength=72
</prop>
<!-- 不启用jpa的类增强机制 -->
<prop
key="openjpa.ClassLoadEnhancement">false</prop>
<prop
key="openjpa.DynamicEnhancementAgent">false</prop>
<prop
key="openjpa.RuntimeUnenhancedClasses">
supported
</prop>
</props>
</property>
</bean>
<bean
name="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property
name="entityManagerFactory"
ref="entityManagerFactory">
</property>
</bean>
<tx:annotation-driven
transaction-manager="transactionManager"
/>
</beans>
4:事务归jpa控制。
/*** 事务归jpa控制。
*
* @author
ctd
*
*/
@Service
public
classTestMain_2 {
@Autowired
private
EntityManagerFactoryfactory;
public
EntityManagerFactorygetFactory() {
return
factory;
}
public
void setFactory(EntityManagerFactoryfactory) {
this.factory = factory;
}
/**
* jpa与Spring结合的过程中。如果事务归jpa控制。
*
* 那么在方法互相调用中。EntityManager由于是用factory.createEntityManager来创建的
*
* 类似(hibernate中session =SessionFactory.openSession)
*
* 因此不同的方法中,获取的manager不是同一个对象。那么事务就不是相同的事务。
*
* 无法保证方法互相调用中事务的统一。
*
* 要保证事务的统一:
*
* 1:使用Spring的声明式事务来统一控制。jpa中不使用事务。
*
* 2:不使用Spring的声明式事务来控制,那么在方法调用过程中,要进行事务对象的传递。
*
*
* @return
*/
public
boolean saveUser() {
EntityManagermanager = null;
EntityTransactiontx = null;
boolean flag =
false;
try {
manager= factory.createEntityManager();
System.out.println("manager_1 = "+ manager);
tx= manager.getTransaction();
tx.begin();
GroupBeangroupBean = newGroupBean();
groupBean.setGroupid(new Integer(1));
groupBean.setGroupname("java组");
GroupUseruser_1 = newGroupUser();
user_1.setUserid(new Integer(10));
user_1.setUsername("用户1");
user_1.setGroupBean(groupBean);
GroupUseruser_2 = newGroupUser();
user_2.setUserid(new Integer(20));
user_2.setUsername("用户2");
user_2.setGroupBean(groupBean);
manager.persist(groupBean);
manager.persist(user_1);
int i = 10/0;
manager.persist(user_2);
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}
return flag;
}
public
static void main(String[] args) {
ApplicationContextcontext = newClassPathXmlApplicationContext(
"applicationContext.xml");
TestMain_2testMain_2 = (TestMain_2) context.getBean("testMain_2");
testMain_2.saveUser();
}
}
5:事务归Spring控制。
5.1:在配置文件中打开声明式事务的注解。
<beanname="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">
<propertyname="entityManagerFactory"
ref="entityManagerFactory">
</property>
</bean>
<tx:annotation-driventransaction-manager="transactionManager" />
5.2:在代码中控制事务:
/*** 事务归Spring声明式事务控制。
*
* @author
ctd
*
*/
@Service
@Transactional
public
classTestMain_3 {
@PersistenceContext
/**
* @PersistenceContext,将创建的EntityManager放到上下文对象中。
*
* 达到EntityManager在方法中共享效果 ==类似于Hibernate中的getCurrentSession的操作。
*/
private
EntityManager manager;
public
EntityManagergetEntityManager() {
return
manager;
}
public
void setEntityManager(EntityManagermanager) {
this.manager = manager;
}
@Autowired
private UserDAO
userdao;
/**
* 方法要受到声明式事务的管理:必须声明为public类型。
*
* @return
*/
public
boolean saveGroup() {
boolean flag =
false;
try {
System.out.println("saveGroup--->manager = " +
manager);
GroupBeangroupBean = newGroupBean();
groupBean.setGroupid(new Integer(1));
groupBean.setGroupname("java组");
manager.persist(groupBean);
// 测试:相同类中相同的方法,事务是否一致性。
// this.saveUser();
// 测试:不同类中方法的调用,事务是否一致性
userdao.saveUser();
}catch(Exception e) {
e.printStackTrace();
throw
new RuntimeException(e);
}
return flag;
}
public
void saveUser() {
System.out.println("saveUser--->manager = " +
manager);
GroupBeangroupBean = (GroupBean) manager.find(GroupBean.class,
new Integer(1));
GroupUseruser_1 = newGroupUser();
user_1.setUserid(new Integer(10));
user_1.setUsername("用户1");
user_1.setGroupBean(groupBean);
GroupUseruser_2 = newGroupUser();
user_2.setUserid(new Integer(20));
user_2.setUsername("用户2");
user_2.setGroupBean(groupBean);
manager.persist(user_1);
int i = 10 / 0;
manager.persist(user_2);
}
public
static void main(String[] args) {
ApplicationContextcontext = newClassPathXmlApplicationContext(
"applicationContext.xml");
TestMain_3testMain_3 = (TestMain_3) context.getBean("testMain_3");
testMain_3.saveGroup();
}
}
相关文章推荐
- 正则表达式 java.util.regex Pattern
- JAVA自然排序(求赞)
- Java同步锁
- Java Spring各种依赖注入注解的区别
- java实现 日期字符串 转换成 日期对象
- Spring-11:通过FactoryBean配置Bean
- Java设计模式之装饰者模式
- Struts的工作流程:
- 【设计模式】java常用设计模式
- Spring容器中Bean的作用域
- 《Java中的泛型如何使用》
- 深刻理解Java编程的7个例子
- 翻转单词序列
- Java多线程-线程的同步与锁
- Java 泛型方法的定义
- 《Java之异常处理》
- Java中HashMap遍历的两种方式
- java_opts 参数
- 进制之间的转换 Java
- RxJava实现事件总线——RxBus