mysql - 为什么 EclipseLink 's auto commit doesn' 不能与 MySQL 一起使用?

标签 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();

当代码运行到这一行时,“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 )时,才会刷新对持久性上下文所做的所有更新。这就是为什么第二个代码片段在调用 EntityTransactionbegincommit 方法时发出 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/

相关文章:

java - 找不到符号: @XmlInverseReference

MySQL 从转换为 varchar 的 datetime 中删除剩余时间。子字符串()?

用于添加和查看引用表中的值的 JPA 注释

java - 如何在不在 JPA 中加载相关实体的情况下使用外键保存实体?

java - Spring Data 仅使用 EntityGraph 抛出 EntityNotFoundException

java - XmlDiscriminatorNode、XmlSchema 命名空间和 elementFormDefault=QUALIFIED

java - 从 javabean 制作自定义 xml

mysql - 2个任务-创建表

MySQL TIMESTAMP 停止处理夏令时转换

mysql - 如何计算平均值?