首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate session.persist() vs JPA entityManager.persist()

Hibernate session.persist() vs JPA entityManager.persist()
EN

Stack Overflow用户
提问于 2014-07-07 18:29:06
回答 2查看 1.5K关注 0票数 2

来自Java持久化的Hibernate (Manning,2007),第419页:

我应该在会话中使用持久性()吗?Hibernate会话接口还提供了一个持久化()方法。它具有与JPA的持久化()操作相同的语义。然而,这两项行动在冲洗方面有一个重要的区别。在同步过程中,Hibernate会话不会将持久化()操作级联到关联的实体和集合,即使您用此选项映射了关联。--只有在调用persist()!时才能到达的实体才会级联,如果使用会话API,则只在刷新时级联保存()(和update())。然而,在一个JPA应用程序中,情况正好相反:只在齐平时层叠在一起。

如此难以辨认的措辞..。什么是“当您调用持久性()时可以访问的实体”?

如果我更新了一个关联的实体,那么它不应该是“可访问的”吗?

还有..。如果它是session.persist()行为的一部分,那么为什么它不在javadoc中?

EN

回答 2

Stack Overflow用户

发布于 2014-07-07 19:51:09

我真的不知道这是不是真的,但我至少可以解释一下这意味着什么。

假设您有以下实体:

代码语言:javascript
复制
public class Order {
    @OneToMany(cascade = PERSIST)
    private List<OrderLine> lines;
    // ...
}

你做了以下事情:

代码语言:javascript
复制
Order order = new Order();
session.persist(order);
OrderLine line = new OrderLine();
order.addLine(line);
session.flush(); // the flush could also be called implicitely, when committing or executing a query

根据问题中的文本,行将不会持久化,因为在调用persist(order)时,从顺序中无法到达该行:此时,该行还没有按顺序排列。

另一方面,您是否使用实体管理器:

代码语言:javascript
复制
Order order = new Order();
em.persist(order);
OrderLine line = new OrderLine();
order.addLine(line);
em.flush(); // the flush could also be called implicitely, when committing or executing a query

然后行将被持久化,因为当实体的状态被同步到数据库时,它可以从刷新时的顺序到达。

票数 0
EN

Stack Overflow用户

发布于 2014-07-07 20:51:57

Hibernate的EntityManager实现是:

代码语言:javascript
复制
org\hibernate\hibernate-entitymanager\4.3.5.Final\hibernate-entitymanager-4.3.5.Final-sources.jar!\org\hibernate\jpa\spi\AbstractEntityManagerImpl.java

这是persist()方法。

代码语言:javascript
复制
@Override
public void persist(Object entity) {
    checkOpen();
    try {
        internalGetSession().persist( entity );
    }
    catch ( MappingException e ) {
        throw convert( new IllegalArgumentException( e.getMessage() ) ) ;
    }
    catch ( RuntimeException e ) {
        throw convert( e );
    }
}

所以JPA持久化(实体)实际上是在调用org.hibernate.internal.Session.persist(entity).

因此,在持久化实体方面,JPA和Hibernate之间不应该有任何区别。

它只被级联到那些在您调用持久性()时可以到达的实体!

2007年,Hibernate 3.2已经发布,3.3版已经发布。那时的JPA只是一份草案

您还可以使用EJB3 >>>早期的草案中定义的语义,而不是保存()。

但根据医生的说法:

如果传递一个父级来持久化(),那么所有的子级都会被传递到持久性()

对于JPA来说,级联持久性()是有意义的,因为根本没有save()操作。但是,当时人们使用的是saveOrUpadet()、saveOrUpdateCopy(),甚至是saveOrUpdateCopy(),它们被弃用而倾向于持久化()和合并()。

当时,持久化的JPA定义只是一个草案,所以特定的实现并没有反映出一个明确的特性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24617311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档