0

我正在学习 EJB3.1 和 JPA2

我正在为插入和更新做以下事情

插入

Common com = new Common();
com.setKeyData(keyData);
com.setKeyValue("0001");
em.persist(com);

更新

Common com = em.find(Common.class, pk);
com.setKeyValue("0002");

上面的代码有效,但我想知道插入和更新是否只需要这样做。我看到很少有他们做 begin()、commit() 等的帖子(可能在 Swing 应用程序中使用)。由于我是 JPA/ORM 的新手,我真的很想知道上述代码是否足以用于具有大量数据负载的应用程序,是否有任何我遗漏的内容,或者我应该阅读/了解有关插入/更新数据的更多信息。

我应该何时使用 EntityManager 的 close、clear 和 flush 方法,在哪种情况下使用它。

4

4 回答 4

1

在大多数情况下,您的代码应该没问题。在许多 EJB 开发中,事务的生命周期将由容器处理——因此无需显式标记事务的开始。

对于更细粒度的控制,您还可以使用 Bean 托管事务,您需要在其中调用 begin 和 commit/rollback 来自己管理生命周期。

有关更多详细信息,请查看:

容器管理: http: //java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction3.html bean管理:http: //java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction4 .html

于 2012-08-23T18:44:31.970 回答
1

将 EJB 与 JPA 一起使用时,您不必担心在开始事务、提交它们之后。所有这些都由底层的 Container 完成。使用 EJB 时,您只需要使用 @PersistentContext(name="CustDB") 对其进行注释

@PersistenceContext(name="PersistentUnitName")
private EntityManager entityManager;
于 2012-08-23T18:50:43.390 回答
1

begin/commit 用于控制事务(以确保ACID),如果这不是由其他人为您完成的(参见其他帖子)。

事务的可能用法如下所示:

EntityManager em = ...
EntityTransaction tx = null;
try {
  tx = em.getTransaction();
  tx.begin();
  // your code that should be executed within the transaction
  tx.commit();
} catch(Exception ex) {
  // roll back if something failed
  if (tx != null && tx.isActive()) {
    tx.rollback();
  }
} finally {
  // make sure em is closed on commit and on rollback
  em.close();
}
于 2012-08-23T18:51:01.687 回答
0

EntityManager如果它是应用程序管理的,您应该关闭它。这意味着您自己创建了它(没有注入)。如果您想自己管理事务(或 Bean Managed Transaction) ,您应该使用begin, ...。但通常您将使用(Container Managed Transaction) 并且此方法将无用。如果交易当前已打开,您可以在任何地方使用。如果要从持久性上下文中分离所有托管实体,可以使用方法。commitBMTCMTflushclear

但是我的回答很短,我认为这个链接对你有用。相关书籍中也有很多细节。

于 2012-08-23T18:49:10.747 回答