- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近遇到了一个有趣的问题。我在项目中使用JPA+Hibernate+EJB。该问题涉及在同一事务中保存和删除实体。使用的数据库表具有在两列上定义的唯一约束。
我所做的是删除实体调用
entityManager.remove();
然后添加新实体,在与唯一约束中使用的列关联的两个属性中使用相同的值,但在其他属性中使用不同的值:
entityManager.persist();
这两个操作在单个事务中执行,并按上述顺序执行。先去除,再添加。然而,由于违反了唯一约束,操作似乎以相反的顺序执行。看起来新实体是在删除前一个实体之前添加的。
显然,我可以调用
entityManager.flush()
删除后约束不被违反。但是,在这种情况下,数据会在整个事务提交之前保存到数据库中。这不是一种理想的行为。如果刷新后出现任何问题,事务将被标记为回滚,实体将被删除。
我认为操作顺序与添加到交易中的顺序相同。从我的示例来看,事实并非如此。
有没有办法解决删除后不刷新或不提交事务的问题?
谢谢。
最佳答案
Obviously, I can call
entityManager.flush()
实际上你必须调用它。
However in this case the data is saved to the database before the whole transaction commits.
错误的是:数据已经同步到DB了,但是事务还没有提交,除非你手动提交,对DB有控制权。如果您没有在 EJB 中配置任何东西,并且您的持久化单元是 JTA(请参阅 this question with comments),那么只有在方法从 EJB 层返回后才会提交事务。
I thought that order of operations is the same as they were added to the transaction. From my example it turns out that it is not.
不,JPA 规范不强制实现执行此操作。这就是为什么有 flush()
操作。
Is there any way to solve the issue without flushing or committing the transaction after delete?
是的,正如我所说,使用 flush()
。还要确保您使用事务数据库引擎(例如 MySql 中的 MyIsam 不支持事务)。
关于java - EntityManager 操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284027/
有一些使用多个数据源的示例: @Inject @DataSource("users") AgroalDataSource dataSource1; @Inject @DataSource("inven
我试图使用持久性和 servlet guice 扩展,让简单的 webapp 在 Jetty 上与 Guice 和 JPA 一起工作。 我写了这个服务实现类: public class PersonS
我使用 Hibernate 5.1.0.Final、Guice、Jersey。我有创建 EntityManagerFactory 的 HibernateModule并管理EntityManager实例
我正在使用 ThreadLocal 和请求/实体模式来获取实体。这种情况发生时,我关闭了一个实体管理器,并且在后台有一些实体可以编辑、复制和修改,然后我想将其保留或与新的实体管理器合并。我不知道这是一
好的,我正在使用 EJB 3.0 和 hibernate,我们将 .ear 文件放入嵌入 Apache Tomcat 6.0.18 的 Easy-Beans 1.0.1(带有 Hibernate)部署
我正在使用 Spring + JPA + Hibernate + EntityManager 与数据库对话。我收到“A JTA EntityManager cannot use getTransact
更新数据库时我应该更喜欢什么?这两种方法的优缺点是什么?我什么时候应该使用其中一种? public void disemployEmployee(Integer employeeId, Date en
我正在尝试在存储库中注入(inject) EntityManager。 编译成功,但是当我运行应用程序并发送一个发布请求时,我收到了这个错误: Unexpected error occurred: F
我正在尝试在 Spring Tools Suite 和 Pivotal tc Server Developer Edition 上开发 Spring+Hibernate+EntityManager+S
我有一个使用 spring boot + spring data JPA 的示例项目。在日志中,我观察到 EntityManagers 在我进行第一次 rest 调用之前被创建了几次。请澄清为什么会发
给定网络应用程序中的以下情况: // EntityManager em, one per Request with Spring's OpenEntityManagerInViewFilter //
当我们在 JAVA EE 环境中的 EntityManager 上使用 @PersistenceContext 注释时,容器将创建 entityManagerFactory(我猜是整个 session
我遇到了一种情况(我认为这很奇怪,但可能很正常),我使用 EntityManager.getReference(LObj.getClass(), LObj.getId()) 来获取数据库实体,然后通过
我有以下服务... @Stateless @LocalBean public class RandomService { @EJB RandomString stringTokenizer;
我在实体类中有这个函数,但 getDoctrine 不喜欢...... public function getObject() { $em = $this->getDoctrine()->ge
我正在尝试以级联方式保存某个对象并检索它。 我有 3 个对象超过 3 个实体。 实体: class Order { /** * @var integer $id *
我正在开发一个 JPA 应用程序(使用 hibernate ),我正在与 作斗争。自动冲洗 特征。 默认情况下,每当我们处理对任何实体的查询时,完整的 实体管理器 被冲洗。在大多数情况下这是可以的:我
我刚刚建立了一个到目前为止仍然非常小的项目 maven/jpa/hibernate 项目,我试图在其中持久化一个对象。 我的类(class)是一个非常简单的类(class): @Entity publ
我当前的项目使用 HSQLDB2.0 和 JPA2.0 。 场景是:我查询数据库以获取 contactDetails 的列表的 person .我删单contactInfo在 UI 中,但不保存该数据
我是 jpa 和 spring 世界的新手,我目前正在对一个简单的方法进行一些单元测试,但只有当我在单元测试模式下运行我的测试类时才会继续收到此错误消息: java.lang.IllegalState
我是一名优秀的程序员,十分优秀!