看到这个问题。
事实证明,即使没有手动提交事务,在提交TX之前,此人在调用save()方法后仍具有一个ID。
数据库不是负责ID字段的输入吗?如果是这样,如何在提交之前填充ID字段?在提交TX之前是否与DB进行任何通信?
是的,允许JPA在事务提交之前与数据库进行通信。它可能发生,即当您显式调用时EntityManager#flush()
。
而且,只要有必要,JPA提供者就可以执行刷新操作。但是,为方便起见,JPA提供程序将数据库操作延迟到将提交事务的时间。
一些自动ID生成器策略必须访问数据库以获取PK值(据我所知,该IDENTITY
策略以这种方式起作用)。
相反,TABLE
or SEQUENCE
生成器不必点击数据库即可获取ID值。他们使用的allocationSize
参数要求的数据库表或序列的一个
批次 的ID将被赋予新的实体,而不与数据库进行进一步的沟通。
问题内容: 我需要从存储过程中写入日志表。现在,此日志信息必须能够在回滚过程中幸免。 我知道以前曾问过这个问题,但是我的情况有所不同,在这些问题中找不到我的问题的答案。 当存储过程中没有错误时,事情就很简单了,日志表中的条目就在那里。 当有错误时,事情就变得复杂了。 在该过程中,我可以在catch中进行回滚,然后将数据插入日志表,我知道并且我已经在这样做了。 但是问题是当存储过程这样调用时: 我知
上下文是带有Hibernate和Spring的Java-JPA。 让我们以两阶段提交协议的场景为例(但只有一个资源): > 要从应用程序提交的 查询 3.2如果没有 3.2.1回滚到数据库 我想要的是一种在代码中从3.1.1进行回调的方法,但只有当知道事务将被提交,但在实际提交之前。另外,如果在这里抛出异常,则应该回滚事务。 null
一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。 问题: > 使用find方法从数据库加载实体,实体存储在会话中 用户更改实体并点击保存 用户更改反映在会话中存储的实体上(在控制器中) 实体被发送到服务类中的
我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。 这是我的代码: 有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?
问题内容: 我使用的是Hibernate事件监听器,喜欢在插入,删除和更新期间执行一些操作。现在,我想使用JPA侦听器执行此操作,因为如果我想从Hibernate迁移到任何其他JPA提供程序,则我的侦听器应该可以工作。Hibernate侦听器为我提供了从中获取事务并检查其提交还是回滚的功能。JPA侦听器仅向我提供实体对象。现在如何在JPA侦听器中获取事务或会话或实体管理器?提前致谢!!我正在使用J
我使用Hibernate事件监听器(如)在插入、删除和更新过程中执行一些操作。现在我想使用JPA listener来完成这一工作,因为如果我想从Hibernate转移到任何其他JPA提供程序,我的listener应该可以工作。Hibernate listener给我,我可以从中获取事务并检查它是提交的还是回滚的。JPA侦听器只为我提供实体对象。现在我如何在JPA侦听器中获得事务或会话或实体管理器?