jpa与spring整合
来源:互联网 发布:网络教育统考英语没过 编辑:程序博客网 时间:2024/05/26 02:52
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---->EntityManager
Hibernate:SessionFactory---->Session
3:applicationContext.xml的配置
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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-scanbase-package="com.test"></context:component-scan>
<!-- 定义一个数据源 -->
<beanname="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<propertyname="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<propertyname="url"
value="jdbc:sqlserver://127.0.0.1:1433;databaseName=Java1503">
</property>
<propertyname="username"value="sa"></property>
<propertyname="password"value=""></property>
</bean>
<beanname="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<propertyname="persistenceProviderClass"
value="org.apache.openjpa.persistence.PersistenceProviderImpl">
</property>
<propertyname="packagesToScan"value="com.jpa.entity">
</property>
<propertyname="jpaProperties">
<props>
<propkey="javax.persistence.jdbc.driver">
com.microsoft.sqlserver.jdbc.SQLServerDriver
</prop>
<propkey="javax.persistence.jdbc.url">
jdbc:sqlserver://localhost:1433;DatabaseName=java1411;SelectMethod=cursor;
</prop>
<propkey="javax.persistence.jdbc.user">sa</prop>
<propkey="javax.persistence.jdbc.password"></prop>
<propkey="openjpa.jdbc.SynchronizeMappings">
buildSchema(ForeignKeys=true)
</prop>
<propkey="openjpa.Log">SQL=TRACE</prop>
<propkey="openjpa.ConnectionFactoryProperties">
PrettyPrint=true,PrettyPrintLineLength=72
</prop>
<!-- 不启用jpa的类增强机制 -->
<propkey="openjpa.ClassLoadEnhancement">false</prop>
<propkey="openjpa.DynamicEnhancementAgent">false</prop>
<propkey="openjpa.RuntimeUnenhancedClasses">
supported
</prop>
</props>
</property>
</bean>
<beanname="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<propertyname="entityManagerFactory"
ref="entityManagerFactory">
</property>
</bean>
<tx:annotation-driventransaction-manager="transactionManager"/>
</beans>
4:事务归jpa控制。
/**
* 事务归jpa控制。
*
* @authorctd
*
*/
@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声明式事务控制。
*
* @authorctd
*
*/
@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 UserDAOuserdao;
/**
* 方法要受到声明式事务的管理:必须声明为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();
}
}
- jpa与spring整合
- Jpa之与Spring整合
- jpa框架与spring框架的整合
- web中spring与jpa整合
- spring 与JPA/Hibernate的整合示例
- jpa学习和jpa与spring整合(一)
- jpa学习和jpa与spring整合(二)
- spring + compass+JPA整合
- 整合Spring和JPA
- 简单 spring + jpa 整合
- JPA整合spring问题
- Spring整合JPA
- spring整合jpa
- spring整合jpa优化
- Spring整合Jpa框架
- JPA整合Spring
- Spring整合JPA
- Spring:整合JPA
- 怎么样理解同步清零和异步清零?
- android开发 软键盘顶布局解决方法
- Python爬虫
- No module named yum错误的解决办法
- 又见GCD hd 2504
- jpa与spring整合
- 利用JMF可播放多种格式的音乐
- Cocos2d-x 3.11.1 Mac 编译Android Studio
- 像花椒,映客,来疯这种直播app,技术实现难度在哪?需要什么样技术人才,还有就是服务器带宽要求及成本?
- UIApplication&程序启动原理
- Linux netstat命令详解
- Java-Stack
- Android使用UncaughtExceptionHandler捕获全局异常
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系