spring生成EntityManagerFactory的三种方式
来源:互联网 发布:调度数据网通信维护 编辑:程序博客网 时间:2024/06/07 08:02
from: http://www.cnblogs.com/beiyeren/archive/2013/01/23/2873210.html
1.LocalEntityManagerFactoryBean
只是简单环境中使用。它使用JPA PersistenceProvider自动检测机制( according to JPA's Java SE bootstrapping ),并且大多数情况下,你只能定义一下persistence unit name
例如:
<beans>
<bean id=
"myEmf"
class
=
"org.springframework.orm.jpa.LocalEntityManagerFactoryBean"
>
<property name=
"persistenceUnitName"
value=
"myPersistenceUnit"
/>
</bean>
</beans>
2.从JNDI获取EntityManagerFactory
这个选项是当你应用发布在javaee5的服务器中。你可以参阅自己应用服务器文档,如何发布一个自定义的JPA provider到你的应用服务器中。
例:
<beans>
<jee:jndi-lookup id=
"myEmf"
jndi-name=
"persistence/myPersistenceUnit"
/>
</beans>
当javaee服务器启动时,会自动检测persistence units。实际上,是检测应用包中的META-INF/persistence.xml 文件和web.xml中的persistence-unit-ref,以及定义的environment naming。我理解就是JNDI的name。
一般应用情景是:
在META-INF/persistence.xml中 使用<jta-data-source>java:/ MySqlDS</jta-data-source> 获取容器发布的Datesource。
transactions是使用的javaee容器支持的JTA系统,例如tomcat中,可以这样
3.LocalContainerEntityManagerFactoryBean
这个选项中,spring扮演了容器的角色。完全掌管JPA。
LocalContainerEntityManagerFactoryBean会根据persistence.xml创造一个PersistenceUnitInfo实现。
<beans>
<bean id=
"myEmf"
class
=
"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
>
<property name=
"dataSource"
ref=
"someDataSource"
/>
<span style=
"color: #ff0000;"
><property name=
"loadTimeWeaver"
>
</span><bean
class
=
"org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"
/>
</property>
</bean>
</beans>
不是所有的JPA provider都需要load-time weaving。hibernate就不需要。呵呵。 <property name="loadTimeWeaver">这个就不是必须的了。。
Persistence.xml配置:
<persistence xmlns=
"http://java.sun.com/xml/ns/persistence"
version=
"1.0"
>
<persistence-unit name=
"myUnit"
transaction-type=
"RESOURCE_LOCAL"
>
<mapping-file>META-INF/orm.xml</mapping-file>
<exclude-unlisted-classes/>
</persistence-unit>
</persistence>
如何处理多个persistence units。spring提供了PersistenceUnitManager统一管理。
<bean id=
"pum"
class
=
"org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"
>
<property name=
"persistenceXmlLocations"
>
<list>
<value>org/springframework/orm/jpa/domain/persistence-multi.xml</value>
<value>classpath:/my/
package
/**/
custom-persistence.xml</value>
<value>classpath*:META-INF/persistence.xml</value>
</list>
</property>
<span style=
"color: #ff0000;"
><property name=
"dataSources"
></span>
<map>
<entry key=
"localDataSource"
value-ref=
"local-db"
/>
<entry key=
"remoteDataSource"
value-ref=
"remote-db"
/>
</map>
</property>
<!--
if
no datasource is specified, use
this
one -->
<property name=
"defaultDataSource"
ref=
"remoteDataSource"
/>
</bean>
<bean id=
"emf"
class
=
"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
>
<property name=
"persistenceUnitManager"
ref=
"pum"
/>
<property name=
"persistenceUnitName"
value=
"myCustomUnit"
/>
</bean>
dataSources中的key是persistence.xml中配置的datasource名字,value-ref是spring管理的数据源。
另外:
EntityManagerFactory是线程安全的,但是EntityManager不是。
public class ProductDaoImpl implements ProductDao {private EntityManagerFactory emf;@PersistenceUnitpublic void setEntityManagerFactory(EntityManagerFactory emf) {this.emf = emf;}public Collection loadProductsByCategory(String category) {EntityManager em = this.emf.createEntityManager();try {Query query = em.createQuery("from Product as p where p.category = ?1");query.setParameter(1, category);return query.getResultList();}finally {if (em != null) {em.close();}}}}
这样使用有个最大问题就是每次都要创建一个新的entityManager。那么该怎么办?
你可以通过@PersistenceContext获取一个transactional EntityManager("shared EntityManager")。为什么称它为transactional?因为它是一个共享的以及线程安全的当前的transactional EntityManager的一个代理。
public class ProductDaoImpl implements ProductDao {@PersistenceContextprivate EntityManager em;public Collection loadProductsByCategory(String category) {Query query = em.createQuery("from Product as p where p.category = :category");query.setParameter("category", category);return query.getResultList();}}
结束了。
- spring生成EntityManagerFactory的三种方式
- spring生成EntityManagerFactory的三种方式
- spring生成EntityManagerFactory的三种方式
- Spring —— 生成EntityManagerFactory 的 3 种方式
- Spring三种方法创建JPA EntityManagerFactory的方法
- 在Spring环境中建立JPA Spring JPA 提供了三种方法创建JPA EntityManagerFactory:
- PHP生成word的三种方式
- 生成LayoutInflater的三种方式
- PHP生成word的三种方式
- PHP生成WORD的三种方式
- 生成LayoutInflater的三种方式
- 生成图片的三种方式
- PHP生成word的三种方式
- PHP生成word的三种方式
- PHP生成word的三种方式
- PHP生成word的三种方式
- js生成img的三种方式
- Spring(三)Spring三种实例化JavaBean的方式
- OnFocuChangeListener焦点事件
- java 按照中文首字母排序
- ModelMapper
- 【HDOJ】【1012】u Calculate e
- 文章标题
- spring生成EntityManagerFactory的三种方式
- ruby rails心得文章
- ios 网络监控-BMReachability
- 如何实现填写表单内容出错后显示原来的信息
- Java概述
- jquery 表单操作(一)
- jQuery学习之旅 Item9 动画效果
- ios9 3D Touch 实现
- FragmentTabHost切换Fragment时避免重复加载UI