1.在容器中,EntityManager由容器来管理,它的事务由JTA来管理,当调用EntityManager时,容器首先检查是否处在持久化上下文中。
若是,则EntityManager将使用该持久化上下文和其关联的事务;
若没有关联任何持久化上下文,则创建一个新的持久化上下文,并将EntityManager与所在的事务关联。
2.容器托管的EntityManager的持久化上下文的作用范围有两种:
(1)transaction类型
默认,无状态的session bean都是以事务为单位的。
session bean在默认情况下使用的是以一个事务为单位的持久化上下文。
默认,bean中的一个方法即为一个事务。-----即一个方法即为一个持久化上下文的作用范围。
一般事务的方法内建立持久化上下文,事务结束,持久化上下文也就结束。
(2)extended类型
无状态session bean每次调用都会创建新的持久化上下文,在有状态session bean中,客户端要保存客户信息,所有即使多次调用也要
在同样的的持久化上下文中,将持久化上下文的类型设置为EXTENDED类型即可。
@PersistenceContext(type=PersistenceContextType.EXTENDED) private EntityManager em; private Customer customer; public void init(Integer customerId){ customer=em.find(Customer.class,customerId); } public void placeOrder(Integer customerId,Order order){ //与init方法同一个持久化上下文,所有可以直接用customer的方法 customer.getOrders().add(order); em.merge(customer); }
------------------------------------------------------------------------------------------------------------------------
配置persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence 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" version="1.0"> <persistence-unit name="BookStorePU" transaction-type="JTA"> <jta-data-source>java:/jpa</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>