hibernate和JPA的persist,save和merge,update之间的不同

JPA和Hibernate提供了不同的方法去持久化新实体和更新存在的实体。你可以选择JPA'S persist,merge方法和Hibernate's的save和update方法。

它似乎是2对两个相同的方法,你也能使用persist和save去存储一个新实体,和使用merge和update去存储改变一个数据库中的实体。那为什么许多开发者想知道该怎么选择使用哪一个。让我们仔细查看这两个方法不同之处吧。

特别感谢Steve Ebersole提供反馈和对Hibernate's隐藏实现独到的见解。

Entity状态-瞬态
在讲解这个4个方法之前,我需要给你快速介绍JPA's实体生命周期状态。

 

如果一个实体存在(attached)当前的持久上下文中,它有着被管理的生命周期状态。

那就意味着它有一条记录映射到数据库中。你的持久化生成器生成需要的插入和更新sql语句去执行所有的改变。一个管理实体也存储到一级缓存里面。

当你创建了一个新实体,它表示瞬时状态,它保持这个状态直到你从当前持久上下文中分离实体。在下个章节,我将显示你怎样能使用JPA's persist和Hibernate’s保存方法。同样的一个实体处在瞬时状态,它没有映射到一条数据库记录和没有被任何持久化上下文管理。

在分离生命周期状态下的实体不再被持久化上下文管理。那样的情况是你关闭了持久化上下文或者你明确的从持久化上下文中分离了实体,在最后一个章节,我将更详细的说明你怎样使用JPA's merge和hibernate's update方法重新关联这些实体。

最后一个生命周期状态是removed.这些实体在预先删除之前是前面状态管理的。删除实体在这次提交范围之外,因此我没有太多关于它的讲解。你能通过调用EntityManager接口上的remove方法删除一个实体。

持久化一个新实体使用persist或者save
当你创建一个新实体对象,它是处在瞬时状态下。它没有映射到任何数据库记录。

Author a = new Author();
a.setFirstName("Thorben");
a.setLastName("Janssen");

你需要关联实体到持久化上下文,所以它变成可管理的和持久化到数据库中,你能选择使用JPA‘s persist或者Hibernate's save方法。两个方法看起来似乎是一样的,但是它们有一些不同。

规则说明书和所有权API

最明显的地方是JPA规则说明书定义的是persist方法。你能用所有的JPA实现使用它。save方法,换句话说,是hibernate指定的。因此它不能使用其它JPA实现。

但是这个只是相关的,如果你想使用其它的JPA实现替换hibernate,可以使用Eclipse Line或者OpenJPA

返回类型和执行SQL语句
另一个不同之处是这两个方法他们的返回类型。JPA's persist方法返回void和Hibernate's save方法返回一个带有主键key的实体。

这个看起来像是有很大的不同,尤其当你更仔细看看Hibernate's javadoc和JPA说明文档。
1、hibernate's save方法的帮助文档的状态先生成一个主键值:
Persist获取瞬时实例,先设定生成一个ID标识。
javadoc Session.save(entity);
2、你没有找到任何信息关于这个JPA说明文档。当主键值被设定时它没有被定义。因此在调用persist方法和flush持久化上下文之间的时候,持久化提供者能在任何时间内实例化。
在大多情况下,如果你在调用save或者persist它没有任何不同.Hibernate使用实体类名称和主键值存储实体在一级缓存里面。因此,在执行persist方法时需要一个主键值。

在大多情况下,当你调用persist或者save方法时,Hiberante在必要的时候会立即生成主键值和触发一个SQL语句
但是除了一种情况之外,如果你使用IDENTITY 策略和在没有一个活动的事务或者有FlushMode.MANUAL的情况下试图持久化一个实体,在这种情况下,Hibernate推迟执行SQL插入语句和创建一个缓存主键值.但是如果你调用save方法,Hiberante立即执行插入语句并且从数据库中返回一个主键值。

注意:文章到这里还没有完,由于篇幅限制,完整内容请到hongfu951博客上查看

完整内容URL地址:persist,save和merge,update之间的不同,我们该怎么使用?

欢迎访问:www.hongfu951.com博客,查看更多文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值