使用以下代码:
EntityManager manager = factory.createEntityManager();
manager.setFlushMode(FlushModeType.AUTO);
PhysicalCard card = new PhysicalCard();
card.setIdentifier("012345ABCDEF");
card.setStatus(CardStatusEnum.Assigned);
manager.persist(card);
manager.close();
当代码运行到这一行时,“card”记录不会出现在数据库中。但是,如果使用 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 连接/J 5.1
最佳答案
我假设您在 Java SE 应用程序或 Java EE 应用程序中使用 EclipseLink,但使用应用程序管理的 EntityManager,而不是容器管理的 EntityManager。
在这两种情况下,仅当与 EntityManager 关联的事务提交(使用 EntityTransaction.commit
)或刷新 EntityManager 的持久性上下文(使用 EntityManager.flush
)时,才会刷新对持久性上下文所做的所有更新。这就是为什么第二个代码片段在调用 EntityTransaction
的 begin
和 commit
方法时发出 INSERT,而第一个代码片段则不会。 t;调用 em.persist
不会发出 INSERT
。
就 FlushModeType
值而言,the API documentation声明如下:
COMMIT
public static final FlushModeType COMMIT
Flushing to occur at transaction commit. The provider may flush at other times, but is not required to.
AUTO
public static final FlushModeType AUTO
(Default) Flushing to occur at query execution.
由于在第一种情况下尚未执行查询,因此不会发出刷新,即不会发出与 PhysicalCard
实体的持久性相对应的 INSERT
语句。这是第二个中 EntityTransaction
的显式提交,导致发出 INSERT
语句。
关于mysql - 为什么 EclipseLink 's auto commit doesn' 不能与 MySQL 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793581/