休眠中的自然身份证

自然ID是可以唯一标识一个实体的一个或一组属性。 我们最多可以为一个实体定义一个自然ID。 当Hibernate在实体映射文件中看到natural-id标记时,它会自动在构成natural-id的属性上创建唯一且非空的约束。 首先,让我们看一下简单和复合自然ID的示例。

简单的自然ID:一个人可以通过其选民ID进行唯一标识。 因此,可以说这可能来自他的自然身份。

<!-- Version 1 -->
<hibernate-mapping package="com.pramati.model"><class name="Person" table="PERSON"><id name="id" column="ID"><generator class="native"/></id><natural-id><property name="voterId" type="string" column="VOTER_ID"/></natural-id><property name="name" type="string" column="NAME"/><!-- Other properties -->
</class>
</hibernate-mapping>

复合自然ID:电话号码,即标准代码和固定电话号码的组合,可以形成个人实体的自然ID。

<!-- Version 2 -->
<hibernate-mapping package="com.pramati.model"><class name="Person" table="PERSON"><id name="id" column="ID"><generator class="native"/></id><natural-id><property name="stdCode" type="string" column="STD_CODE"/><property name="landlineNumber" type="string" column="LANDLINE_NUMBER"/></natural-id><property name="name" type="string" column="NAME"/><!-- Other properties -->
</class>
</hibernate-mapping>

因此,Hibernate在stdCode和landlineNumber上创建了一个非空约束。 这些属性一起对于个人实体应该是唯一的。

默认情况下,自然ID是不可变的。 因此,假设您尝试从数据库中加载人员实体并更改构成自然ID的任何属性,则Hibernate将引发异常。 例如,我们已加载Person并尝试在活动会话中修改其landlineNumber / stdcode,这是我们会得到的例外:

org.hibernate.HibernateException:: An immutable natural identifier 
of entity com.pramati.model.Person was altered from abc to xyz

Hibernate 4.1提出了通过bean的natural-id加载实体的功能。 到目前为止,会话缓存将缓存通过当前会话中的get / load加载的对象。 现在,默认情况下还将缓存使用natural-id加载的对象。 以下是会话API的最新功能:

public NaturalIdLoadAccess byNaturalId(String entityName);
public NaturalIdLoadAccess byNaturalId(Class entityClass);public SimpleNaturalIdLoadAccess bySimpleNaturalId(String entityName);
public SimpleNaturalIdLoadAccess bySimpleNaturalId(Class entityClass);

我们可以通过自然ID加载类的实例,如下所示:

// In case of version 1 defined above:
Person person = (Person)session.byNaturalId(Person.class ).using( "voterID", "ZAAXDFT435" ).load();// For Version 1, this can be simplified as:
Person person = (Person)session.bySimpleNaturalId(Person.class ).load("ZAAXDFT435");// In case of version 2 defined above:
Person person = (Person)session.byNaturalId(Person.class ).using("stdCode", "040").using("landlineNumber","2345678").load();

请注意,负载返回的实体不仅是代理,而且是实际实体本身。 如果要获取代理,则必须使用getReference()代替load(),如下所示:

session.byNaturalId(Person.class )
.using("stdCode", "040")
.using("landlineNumber","2345678")
.getReference();

为了保持一致性,新方法也可用于基于标识符的加载。

public IdentifierLoadAccess byId(String entityName);
public IdentifierLoadAccess byId(Class entityClass);

因此,我们可以使用session.byId(Person.class).getReference(id)代替session.load(Person.class,id)。 而不是session.get(Person.class,id)我们可以使用session.byId(Person.class).load(id)

当我们使用查询缓存时,自然ID也很有用。 查询缓存通常没有那么有用,因为它经常变得无效。 假设事件序列如下:

方案1:

1.使用实体natural-id中的属性进行HQL查询以加载人员A。 查询也被缓存,即query.setCacheable(true)
2.将另一个人B插入到人表中。
3.现在,使用与步骤1中相同的查询再次加载A。 问题是:在步骤3中,将执行新的数据库调用以从“人”表中获取A。 是还是不是?

答案是肯定的。 发生的事情是Hibernate在内部维护一个时间戳缓存。 这个时间戳缓存记录特定的Hibernate受管表被修改的时间。 现在在步骤(3),Hibernate看到它是一个缓存的查询。 但是在返回存在于缓存中的实体之前,它会验证缓存的结果相对于表修改时间是否较旧。 现在,在缓存后修改表之后,Hibernate再次进行新查询。

为了进一步了解这一点,让我们考虑以下情形:让我们只在名称为Rama的Person表中进行记录

方案2:

一个。 执行缓存的查询以获取名称与“ Rama”匹配的人员列表:“来自人员名称为“ Rama”的人员”
b。 也将记录插入名称也为“ Rama”的“个人”中。 这不是问题,因为名称未定义为唯一属性 C。 现在,再次执行步骤(a)中的查询。

最初在步骤(a),我们仅获得记录。 但是在步骤(c)中,即使结果被缓存,休眠也会再次命中数据库。 这是由于时间戳缓存无效而发生的。 Hibernate只是在从缓存返回实体之前检查表是否已被修改。 但是,无论是更新,插入还是后续操作,都不会影响表的更新方式。

但是在我们看过的前一种情况中,此验证检查似乎完全不相关,因为插入的记录与加载的实体无关。 如果我们使用自然ID来获取实体,则可以绕过此检查。 使用natural-id时,可以保证即使修改数据库后结果也不会改变。 早些时候,当我们不支持使用自然ID加载实体时,我们在Criteria API中提供了使用自然ID的规定。 我们可以在方案1的步骤(1)和(3)中使用以下内容

session.createCriteria(Person.class).add(Restrictions.naturalId().set("stdCode", person.getStdCode()).set("landlineNumber", person.getLandlineNumber())).setCacheable(true).uniqueResult();

当使用自然ID来获取实体时,时间戳缓存检查将被绕过。 因此,现在如果我用此条件而不是查询替换第一种情况的步骤(1)和(3),则数据库只会被命中一次。 如果我们使用Restrictions.eq而不是Restrictions.naturalId,则数据库将被命中两次。 另外,如果您使用的是最新版本的Hibernate,我们可以使用新的API代替构建标准。

参考: prasanthnath博客上的JCG合作伙伴 Prasanth G提供了Hibernate中的Natural Ids 。

翻译自: https://www.javacodegeeks.com/2013/10/natural-ids-in-hibernate.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s源码分析 pdf_rook源码分析之一:rook架构解析

rook简介Rook是一款云原生环境下的开源分布式存储编排系统&#xff0c;目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢…

24 python异常机制

1 --------------------捕获多个异常-------------------------------------------2 try:3 pass4 except Exception1 as e:5 raise 6 except Exception2 as e:7 raise 8 except Exception3 as e:9 raise 10 。。。。等等 11 12 ##--- 其实等同于以下&#xf…

.net压缩文件夹

1&#xff0c;引用&#xff1a;using System.IO.Packaging; 2&#xff0c;压缩文件的方法&#xff1a; /// <summary>/// 压缩文件夹到制定的路径/// </summary>/// <param name"folderName">要压缩的文件物理路径</param>/// <param nam…

weex eros框架源码解析

weex eros是基于alibaba weex框架进行二次封装的客户端跨平台开发框架&#xff0c;主要是为前端开发者&#xff08;可以不用熟悉客户端开发)提供的一站式客户端app开发解决方案。官网地址为&#xff1a;https://bmfe.github.io/eros-docs/#/。为了方便前端开发者和客户端开发者…

什么是可重入锁?

在Java 5.0中&#xff0c;增加了一个新功能以增强内部锁定功能&#xff0c;称为可重入锁定。 在此之前&#xff0c;“同步”和“易失性”是实现并发的手段。 public synchronized void doAtomicTransfer(){//enter synchronized block , acquire lock over this object.operat…

多选一的图片和文字

利用 radio 做单选事件&#xff0c;js 兄弟选择 nextSibling 获取邻近的图片对象&#xff0c;然后进行改变 例子&#xff1a; CSS <style type"text/css">input[type"radio"] {display: none;}label{font-size: 16px;}.choose_or{width: 1.2rem;heig…

【每日一题】收集足够苹果的最小花园周长

文章目录 Tag题目来源解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【二维网格】【2023-12-24】 题目来源 1954. 收集足够苹果的最小花园周长 解题思路 方法一&#xff1a;二分枚举答案 思路 通过如下过程&#xff0c;我们可以求出边长为 2n 时&…

小数前的0在html不显示,jsp小数显示问题 例如 我在oracle 数据库中查询出来的是 0.01 但是在jsp页面上就显示成 .01 没有前面的0...

满意答案1234junling2013.08.28采纳率&#xff1a;56% 等级&#xff1a;12已帮助&#xff1a;6022人控制保留几位有效小数的js函数//Code CreateBy abandonship 2007.03.12function FormatAfterDotNumber( ValueString, nAfterDotNum ){var ValueString,nAfterDotNum ;var r…

word文档图标变成白纸_word文档图标变为白纸

请不要盗用我的答案&#xff01;&#xff01;一号方案【新P】注意【原创】&#xff1a;1&#xff0e;安全模式下&#xff0c;效果更好&#xff01;2. 以下所要使用的软件&#xff0c;都要安装或升级到最新版本&#xff0c;以保证使用的效果。3. 不杀毒&#xff0c;直接使用以下…

Jira filter subscribe issues

Jira & filter & subscribe & issues https://confluence.atlassian.com/search/?querysubscribeissues&productNameJiraCore&productVersion7.3]https://confluence.atlassian.com/jiracoreserver073/saving-your-search-as-a-filter-861257224.html 转载…

iView 一周年了,同时发布了 2.0 正式版,但这只是开始...

两年前&#xff0c;我开始接触 Vue.js 框架&#xff0c;当时就被它的轻量、组件化和友好的 API 所吸引。之后我将 Vue.js 和 Webpack 技术栈引入我的公司&#xff08;TalkingData&#xff09;可视化团队&#xff0c;并经过一年多的实践&#xff0c;现已成为整个公司的前端开发规…

Hawtio和Apache JClouds

介绍 我最近花了一些时间为Hawtio开发 Apache Jclouds插件。 尽管还有很多待完成的工作&#xff0c;但我无法激动&#xff0c;想分享…… 这个Hawtio到底是什么&#xff1f; 每当我注意到一个很酷的开源项目时&#xff0c;我通常都会订阅邮件列表&#xff0c;以便我可以更好地…

【转】安全加密(一):这些MCU加密方法你都知道吗?

本文导读 随着物联网和边缘计算的出现&#xff0c;五花八门的MCU也被应用其中&#xff0c;如何保证我们的程序安全和知识产权不受侵犯呢&#xff0c;本文我们将对主流MCU的程序加密进行讲解&#xff0c;希望能够帮助你选择最适合自己应用的微处理器。 1. MCU加密 通常所说的MC…

检验杜宾 瓦森检验法R语言_EVIEWS序列相关检验2.pdf

EVIEWS序列相关检验2序列相关检验、处理及案例内蒙古科技大学经济与管理学院边璐 2011.11.10内容安排• 自相关性的检验• 自相关性的解决方法• 案例分析自相关性的检验• 1、图示法(上节课已说过)• 2、DW检验• 3、回归检验法• 4、高阶自相关性检验2、杜宾-瓦森(Durbin-Wat…

连续出现最长次数

输入第一行有一个整数n(n < 1000)&#xff0c;为数组元素的个数。第二行有n个整数&#xff0c;整数之间以一个空格分开。输出输出最长平台的长度。样例输入 10 1 2 2 3 3 3 4 5 5 6 样例输出 3 #include<iostream> using namespace std; int main() {int a[1001],n;ci…

家用计算机机箱怎么选,一般家用电脑主机买什么配置的比较好

组装台式电脑配置最好的方法&#xff1a;实用性机型建议&#xff1a;首选1&#xff1a;intel G1620双核H61M主板。(价格低廉性能不弱&#xff0c;超值)首选2&#xff1a;intel G1840双核H81M主板。(核心显卡性能比G1620更强)中级机型建议&#xff1a;首选1&#xff1a;intel G3…

浅谈Vue内置component组件的应用场景

官方的说明 渲染一个“元组件”为动态组件。依 is 的值&#xff0c;来决定哪个组件被渲染。 <!-- 动态组件由 vm 实例的属性值 componentId 控制 --> <component :is"componentId"></component>具体可以官网文档中的 动态组件内置的组件compone…

angular路由传递参数_在angular4.0路由传递获取参数的最优方案

这次给大家带来在angular4.0路由传递获取参数的最优方案&#xff0c;在angular4.0路由传递获取参数的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。研究ng4的官网&#xff0c;终于找到了我想要的方法。我想要的结果是用‘&拼接参数传送&#xff0…

计算机基础及ms应用在线,全国一级计算机基础及MS Office应用课件 (2).pdf

全国计算机等级考试一级教程计算机基础及MS Office应用考试大纲考试大纲考试大纲考试大纲考试大纲考试大纲考试大纲考试大纲考点1 &#xff1a;计算机组成结构1946年世界上第一台名为ENIAC的电子计算机诞生于美国宾夕法尼亚大学。考点2 &#xff1a;冯诺依曼概念 冯诺依曼理论…

破坏您的JVM

正如我们最近发现的那样&#xff0c;全面测试可能有害。 扩展测试覆盖范围导致我们仅花费一行代码就进行了几个小时的调试会话。 使调试特别令人不愉快的是&#xff0c;该代码不仅崩溃了所部署的JVM&#xff0c;而且还破坏了其下的虚拟机和/或物理机。 因此&#xff0c;请自行…