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>
EJB中的容器托管的EntityManager持久化上下文
最新推荐文章于 2025-08-17 04:46:05 发布