我正在按照一些教程学习 Java 的持久性。
我正在使用 Java EE 7 和 Payara 服务器。
我注意到每个人都使用不同的持久化方法。
例子:
-
simple
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
}
public void remove(Book book) {
em.remove(book);
}
}
-
with flush()
,当验证策略未设置为“AUTO”时使用持久性.xml, right?
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
em.flush();
}
public void remove(Book book) {
em.remove(book);
em.flush();
}
}
-
有交易
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
utx.begin();
em.persist(book);
utx.commit();
}
public void remove(Book book) {
utx.begin();
em.remove(book);
utx.commit();
}
}
我何时以及为什么必须使用最后一个?
是否有必要使用em.close()
在每个方法的最后?
有哪些好的做法?
第一个方法是没有手动刷新和事务模糊的 EJB 方法,是规范方法。默认情况下,单个 EJB 方法调用已算作单个完整事务。 EJB 容器将在调用方法之前透明地开始事务,并在方法返回时提交事务(或在方法抛出应用程序异常时回滚)。
第二个示例中的手动冲洗是不必要的。一般来说,你想使用em.flush()
仅当您修改实体(即使其变得“脏”)并希望之后(间接)执行SELECT
在同一笔交易中。这种情况很少见,但在现实世界中有使用案例,通常是当您愿意时SELECT
脏实体是其子实体的父实体。
第三个例子中的手动事务管理是完全没有必要的。读完第一段后,您应该已经意识到这一点。仅当您不使用时才需要手动事务管理JTA
, but RESOURCE_LOCAL
(通常,在 Java SE 中而不是 Java EE 中)。
也可以看看:
- 什么时候有必要或方便使用 Spring 或 EJB3 或全部一起使用? https://stackoverflow.com/questions/18369356/when-is-it-necessary-or-convenient-to-use-spring-or-ejb3-or-all-of-them-together
- JSF 请求作用域 bean 会在每个请求上不断重新创建新的有状态会话 bean? https://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req/
- Java EE前端方法中处理服务层异常 https://stackoverflow.com/questions/32853167/handling-service-layer-exception-in-a-jsf-listener-method/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)