为什么EclipseLink的自动提交不适用于MySQL?

时间:2011-07-22 17:10:48

标签: mysql jpa eclipselink

使用以下代码:

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

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语句。