我正在学习EJB3.1和JPA2
我正在做插入和更新的事情
INSERT
Common com = new Common();
com.setKeyData(keyData);
com.setKeyValue("0001");
em.persist(com);
更新
Common com = em.find(Common.class, pk);
com.setKeyValue("0002");
上面的代码有效,但我想知道是否只需要插入和更新。 我看到他们做的几个帖子开始(),commit()等(可能在swing应用程序中使用)。 由于我是JPA / ORM的新手,我真的想知道上面的代码是否足以满足大量数据加载的应用程序,有什么我缺少的,或者我应该阅读/了解有关插入/更新数据的更多信息。
我何时应该使用EntityManager的close,clear和flush方法,在哪种情况下使用它。
答案 0 :(得分: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
答案 1 :(得分:1)
开始/提交用于控制交易(以确保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();
}
答案 2 :(得分:0)
如果是应用程序管理的,您应该关闭EntityManager
。这意味着您自己创建(无需注入)。您应该使用begin
,commit
...如果您想自己管理您的交易(BMT
或Bean管理交易)。但通常您将使用CMT
(容器管理事务),此方法将无用。如果当前打开了交易,您可以在任何地方使用flush
。如果要从持久性上下文中分离所有已管理的实体,可以使用clear
方法。
但我的答案很短,我认为this link对你有用。相关书籍中也有很多细节。
答案 3 :(得分:0)
将EJB与JPA一起使用时,在开始事务并提交它们之后,您不必担心。 所有这些都是由底层Container完成的。 使用EJB时,只需要使用@PersistentContext(name =“CustDB”)注释它
@PersistenceContext(name="PersistentUnitName")
private EntityManager entityManager;