容器托管的EntityManager持久化上下文

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>

你可能感兴趣的:(manager)