JPA导包
Spring和SpringMVC包(web项目的)
用于操作数据库的Springjdbc包和JPA包(jpa是实现ORM规范的)
操作数据的包(其中dbcp包为连接池包)
Spring测试包和AOP包
处理json的包和junit包
Spring配置文件
新建一个applicationContext.xml文件和一个properties文件,properties文件中写入四个内容(ssj为数据库名,username为数据库账号,password为数据库密码)
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///ssj
username=root
password=123
applicationContext.xml文件中填写
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载properti文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--得到EntityManagerFactory-->
<bean id="entityMannagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--配置属性 引用上面的dataSource-->
<property name="dataSource" ref="dataSource"/>
<!--扫描实体类配置-->
<property name="packagesToScan" value="cn.itsource.ssj.domain"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!--是否显示sql-->
<property name="showSql" value="true"/>
<!--是否创建表-->
<property name="generateDdl" value="true"/>
<!--数据库方言-->
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
</bean>
</property>
</bean>
</beans>
然后我们就可以拿到EntityManager了
注解
在类中拿到EntityManager 对象
@PersistenceContext
private EntityManager entityManager;
事务的传播机制:propagation(一共7种)
-
多个方法之间,比如A方法 去调用B方法 事务就可以进行相互传播
-
A转账
-
B手续费
-
Propagation.REQUIRED(常用)
-
表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
-
如果A方法有事务 B方法就运行到A方式事务,如果A方法事务 创建一个事务
-
Propagation.SUPPORTS(常用)
-
表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行
-
如果A方法有事务 ,B方法以事务方式运行,如果A方法没有事务 ,B就没有事务方式运行
-
Propagation.NEVER
-
表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
-
如果当前方法有事务,就会抛出异常 如果没有事务 正常运行
-
Propagation.REQUIRES_NEW
-
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。
-
如果使用JTATransactionManager的话,则需要访问TransactionManager
开启事务,propagation 属性为SUPPORTS时,readOnly 为是否只读
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)