将前面获取EntityManagerFactory的class引用改一下:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
</bean>
我们只需要配置persistenceXmlLocation这个属性,指定到classpath里面的META-INF/persistence.xml。
这种方式是配置JPA的强大的方法。因为它允许在应用程序中灵活进行本地配置。它支持连接现有JDBC数据源,支持本地事务(RESOURCE_LOCAL)和全局事务(JTA)。
另外,还可以与dataSource一起使用,我们的persistence.xml里面不用写连接的属性了,直接就写名字和对应的实体就可以了,例如:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>myentiry.UserInfo</class>
</persistence-unit>
</persistence>
spring的applicationContext配置文件:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value="jdbc:sqlserver://192.168.2.44:1433;databaseName=test" />
<property name="username" value="sa" />
<property name="password" value="sa" />
<property name="initialSize" value="5" />
<property name="minIdle" value="5" />
<property name="maxIdle" value="30" />
<property name="maxActive" value="100" />
<property name="maxWait" value="1000" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="persistenceUnitName" value="MyPU" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
</bean>
第三者方式是用jee:jndi-lookup从JNDI中获取EntityManagerFactory
<bean>
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/myPersistenceUnit"/>
</bean>
在业务逻辑层里面我们得使用@Transactional注释标识,不然方法不会提交事务。
有关spring事务传播和事务隔离请看:
hi.baidu.com/coolcat%5Fpolice/blog/item/59ebc12324be8d4b935807d4.html