使用以下代码:
EntityManager manager = factory.createEntityManager();
manager.setFlushMode(FlushModeType.AUTO);
PhysicalCard card = new PhysicalCard();
card.setIdentifier("012345ABCDEF");
card.setStatus(CardStatusEnum.Assigned);
manager.persist(card);
manager.close();
当代码运行到此行时,“卡”记录不会出现在数据库中。但是,如果使用FlushModeType.COMMIT,并使用如下事务:
EntityManager manager = factory.createEntityManager();
manager.setFlushMode(FlushModeType.COMMIT);
manager.getTransaction().begin();
PhysicalCard card = new PhysicalCard();
card.setIdentifier("012345ABCDEF");
card.setStatus(CardStatusEnum.Assigned);
manager.persist(card);
manager.getTransaction().commit();
manager.close();
它工作正常。从eclipselink的日志中我可以看到前面的代码没有发出INSERT语句而第二个代码就是这样。
我在这里想念一下吗?我正在使用EclipseLink 2.3和mysql connection / J 5.1
答案 0 :(得分:3)
我假设您在Java SE应用程序或Java EE应用程序中使用EclipseLink,但使用应用程序管理的EntityManager而不是容器管理的EntityManager。
在这两种情况下,只有当与EntityManager关联的事务提交(使用EntityTransaction.commit
)或者刷新EntityManager的持久化上下文时(使用EntityManager.flush
),才会刷新对持久性上下文所做的所有更新。 。这就是为什么第二个代码片段在调用EntityTransaction
的{{1}}和begin
方法时发出INSERT的原因,而第一个没有; commit
的调用不会发出em.persist
。
就INSERT
值而言,the API documentation表示以下内容:
<强> COMMIT 强>
public static final FlushModeType COMMIT
在事务提交时刷新。提供者可以刷新 其他时间,但不是必须的。
自动强>
public static final FlushModeType AUTO
(默认)在查询执行时刷新。
由于在第一种情况下尚未执行查询,因此不会发出刷新,即不会发出与FlushModeType
实体的持久性相对应的INSERT
语句。它是第二个PhysicalCard
的显式提交,导致发出EntityTransaction
语句。