当前位置: 首页 > 知识库问答 >
问题:

JPA和Hibernate-“持久化操作”

宋伯寅
2023-03-14

我正在阅读JPA 2.1规范,有这个片段:

通过调用新实体实例上的persist方法或级联persist操作,新实体实例将同时成为托管实例和持久实例。应用于实体X的持久化操作的语义如下:。。。

是否可以在不显式调用persist()方法的情况下调用persist操作,或者persist操作始终必须是通过调用persist()的触发器?

假设我有两个实体A和B,其中A与B有一个域(cascade=PERSIST)关系。

tx.begin();
A a = new A();
B b = new B();
a.getBCollection().add(b);
entityManager.persist(a);
tx.commit();

同:

tx.begin();
A a = new A();
entityManager.persist(a);
B b = new B();
a.getBCollection().add(b);
tx.commit();

在第二个示例中,即使在调用persist()方法后添加了实体,B实体是否会被持久化(持久化操作将被级联)?或者我必须在调用persist()方法之前将B实体添加到集合中,就像第一个示例一样,只有这样persist操作才会级联?

那么#3示例中有两个事务会怎么样:

tx1.begin();
A a = new A();
entityManager.persist(a); //persist with key 1L
tx1.commit();

tx2.begin()
B b = new B();
A a = entityManager.find(A.class, 1L);
a.getBCollection().add(b);
tx2.commit();

在第二个事务中没有对persist()方法的调用,但A处于托管状态,所以B实体会被持久化吗?

共有1个答案

丘学海
2023-03-14

来自JPA规范,第3.2.4节(摘录):

刷新操作的语义学,应用于实体X如下:

  • 如果X是托管实体,则同步到数据库。
    • 对于X中的关系引用的所有实体Y,如果与Y的关系已用级联元素值级联=PERSIST或级联=ALL进行注释,则持久化操作应用于Y

    因此,答案是肯定的,b通过在刷新时从aPERSIST操作级联到它来持久化在所有示例中。

 类似资料:
  • 问题内容: 我试图在spring启动时将JSON对象存储在MySQL数据库中。我知道我做错了事,但是我无法弄清楚到底是什么原因,因为我对Spring还很陌生。 我有一个休息端点,在这里我通过HTTP PUT获取以下JSON对象,并且需要将其存储在数据库中,以便用户以后可以通过HTTP GET获取它。 请注意,在上述情况下,对象 中* 键 的 数量 可能会有所不同,由于该要求,我正在使用a 来捕获控

  • 摘自Java Persistence with Hibernate(Manning,2007)第419页: 我应该在会话上使用持久化()吗?Hibernate会话接口还具有一个持久化()方法。它与JPA的持久化()操作具有相同的语义学。但是,这两种操作在刷新方面有一个重要的区别。在同步期间,Hibernate会话不会将持久化()操作级联到关联的实体和集合,即使您使用此选项映射了关联。它只级联到调用

  • 持久化类(Persistent Object )简称 PO,在 Hibernate 中, PO 是由 POJO(即 java 类或实体类)和 hbm 映射配置组成。 简单点说,持久化类本质上就是一个与数据库表建立了映射关系的普通 Java 类(实体类),例如 User 类与数据库中 user 表通过映射文件 User.hbm.xml 建立了映射关系,此时 User 就是一个持久化类。 持久化类的规

  • 主要内容:JPA级联持久化示例,输出结果级联持久化用于指定如果实体持久化,则其所有关联的子实体也将被持久化。 以下语法用于执行级联持久性操作 - JPA级联持久化示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步:

  • 我一直在尝试使用JPA Hibernate和mysql整理与我的DB的连接,但出于某种原因,无论我尝试什么,在启动tomcat服务器时,我都会遇到相同的异常: 这是我的JPA配置类: } 在这一点上,我想不出还有什么可以尝试的。。任何帮助都是非常感激的 编辑:这是整个堆栈跟踪

  • 我希望在每次加载或持久化实体时包装/展开它。我知道我不能使用JPA监听器来完成这件事,因为它们只能对对象执行一个操作,而不能与其他对象交换它。自然的解决方案是使用方面。但是有没有特别的方法我可以切入呢?问题是要包装/解包装的实体可以是另一个实体的字段...