当前位置: 首页 > 面试题库 >

回滚后,JPA / Hibernate中的实体状态和实体ID值

皇甫展
2023-03-14
问题内容

如果我回滚,会话中的实体会怎样?他们会在交易之前回到状态吗?特别是他们会获得新的ID吗?

例:

session.startTransaction();
Entity e = new Entity(); //e.id == null
session.save (e);        //suppose it was ok
session.rollback();      // e.id == ???

更新

我已经进行了Hibernate 4测试。测试后,该实体已成为新的ID。


问题答案:

我将简单地引用JPA实现(3.3.2事务回滚):

对于事务范围和扩展的持久性上下文,事务回滚都会导致所有先前存在的托管实例和已删除实例[31]分离。实例的状态将是事务回滚时的实例状态。事务回滚通常会导致持久性上下文在回滚时处于不一致状态。特别地,版本属性的状态和所生成的状态(例如,所生成的主键)可能不一致。因此,以前由持久性上下文管理的实例(包括在该事务中成为持久性的新实例)可能无法以与其他分离对象相同的方式重用-
例如,它们在传递给合并操作时可能会失败。[32 ]

这实际上意味着,这取决于在调用之前是否具有ID
em.rollback()(取决于FlushMode和JPA的实现)。如果分配了ID,则该ID将保持设置状态。如果没有,那么您将没有ID。



 类似资料:
  • 问题内容: 当我使用@Entity注释类并尝试解析依赖项时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有hibernate的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hib

  • 问题内容: 我写了一些代码将数据插入SQL数据库。实际上,我正在尝试使用Hibernate学习Struts2。但是,不幸的是,我在提交表格后遇到了问题。 我找不到此错误消息的原因。我的try&catch块引发如下错误: Pojo(): 还具有: 问题答案: 如果未映射实体,则应检查hibernate配置。Hibernate是ORM框架,用于将pojo(实体)映射到数据库架构对象。您没有配置或hib

  • 问题内容: 我有一个具有以下结构的数据库: 当我尝试创建EntityProperty类时 我得到以下异常: 我知道JPA实体必须具有主键,但是由于无法控制的原因,我无法更改数据库架构。是否可以创建将与这样的数据库模式一起工作的JPA(hibernate)实体? 问题答案: 我猜您有一个组合键,其中的外键是。如果是这样,则可以按如下所示进行映射:

  • 使用实体图时,JPA Level 1缓存是如何工作的? 如果我打电话: (顺便说一下,我在这里使用Spring Data,这是我自定义存储库中的一个方法,但这与问题无关)。 这将使用适当的SELECT语句访问数据库,该语句包括系统和制造商表所需的所有连接。这是完美的工作和预期。 然而,如果我称之为: 第一个findOne调用将仅通过选择工具表来命中数据库,这是正常的,但第二个findOne不会命中

  • 问题内容: 您实体的ID是 长 (原始类型)还是 长 (对象类型)? 该ID是表的主键,在数据库中从不为“ null”。 我的同事建议使用“对象类型长”。 默认情况下,Hibernate反向工程工具会生成一个长为id的基本类型。 选择什么? 长还是长? 问题答案: 我认为使用Long更好,因为通过检查该值来检查实体是否具有持久身份是更正确的(在MySQL中,您可以将ID设置为0)。另外,像Spri

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应