![]() |
|
考试大Java站整理收集
在EJB容器,如果你愿意,由容器注入一个EntityManager后,你可以把一切交给容器管理.如果你愿意使用可扩展事务, 当然你已经了解如何管理EntityManager.规范在那儿定着,没有什么可多说的. 在Java SE环境下,没有容器能帮助你做任何事,一切都要由你纯手工创建,当然一切也由你负责管理,关闭,销毁.都是你的事,所以反而变得简单(是说获取持久化手段简单了,不是操作单了).
一.容器管理持久化上下文
而在WEB容器中,一方面容器管理的持久化事务不能象EJB容器那样可以使用扩展性事务,要想让容器管理,那么只能是 JTA事务,而且数据源也一定是JTA-DATA-SOURCE.常有人在网上找到一些persistence.xml,要么使用了本地事务,要么是非JTA的数据源,问我为什么在WEB容器中不能成功注EntityManager.
要在WEB容器中让容器管理持久化事务,可以通过两种方式,一是容器注入,一是JNDI查找.这两种方式并不是每个人都理解的,我看到一本叫<<EJB JPA数据库持久化编程详解>>的书,在网上受到太多的人的追捧(越是这样的书受害者就越多!), 作者明确说"容器托管的EntityManager只能运行在EJB容器中,也就是说只有在EJB-JAR包中,才可以获得容器托管的 EntityManager对象,否则只能获得应用托管的EntityManager对象."
事实上确实一些WEB容器不能注入EntityManager,也不能通过JNDI查找到.但是容器不支持并不是规范不支持,如果你使用glassfish,或者用resin 3.1.2以上(目前已经3.1.6)你就可以方便地获得容器管理的EntityManager.
<?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 persistence_1_0.xsd"
version="1.0">
<persistence-unit name="jpaUnit" transaction-type="JTA">
<jta-data-source>jdbc/__axman</jta-data-source>
<class>com.axman.CustomerEO</class>
</persistence-unit>
</persistence>
<?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 persistence_1_0.xsd"
version="1.0">
<persistence-unit name="jpaUnit" transaction-type="JTA">
<jta-data-source>jdbc/__axman</jta-data-source>
<class>com.axman.CustomerEO</class>
</persistence-unit>
</persistence>只要这个persistence .xml文件在类路径中,就可以正确地注入EntityManager:
//为了阅读方便删除了无关内容和注释
<PRE class=java name="code">public class TestAxman extends HttpServlet {
@PersistenceContext(name="jpaUnit")
private EntityManager em;
@Resource
private UserTransaction utx;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
CustomerEO ce = new CustomerEO();
ce.setName("p4");
ce.setEmail("p4@email.com");
ce.setAsset(12.7d);
ce.setCreateDate(new java.sql.Date(new java.util.Date().getTime()));
utx.begin();
em.persist(ce);
utx.commit();
//容器管理事务不需要自己手工回滚,只要告诉容器事务起止边界
}