hibernate状态_Hibernate状态的自然身份证

hibernate状态

自然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也会再次命中数据库。 这是由于时间戳缓存无效而发生的。 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中的自然ID” 。

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

hibernate状态

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

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

相关文章

android界面实现框架内页面跳转_KVM虚拟化管理平台的实现

KVM虚拟化管理平台的实现源码链接&#xff1a;https://github.com/wsjhk/IaaS_admin.git视频演示链接&#xff1a;https://v.youku.com/v_show/id_XMjg4MTczODU1Ng.html(N年前刚开始学习Python时做的第一个自主设计实现项目&#xff0c;代码实在写的烂&#xff0c;不喜勿喷&…

suse linux 查看内存,Suse linux查询内存大小的指令是什么?

满意答案CJTHI2013.08.18采纳率&#xff1a;49% 等级&#xff1a;12已帮助&#xff1a;5850人下面和大家分享在Linux系统下查看内存使用情况的free命令&#xff1a;[rootscs-2 tmp]# freetotal used free shared buffers cachedMem: 3266180 3250004 16176 0 110652 2668236…

Java 8中的并行和异步编程

并行代码是在多个线程上运行的代码&#xff0c;曾经是许多经验丰富的开发人员的噩梦&#xff0c;但是Java 8带来了许多更改&#xff0c;这些更改应该使这种提高性能的技巧更加易于管理。 并行流 在Java 8之前&#xff0c;并行&#xff08;或并发&#xff09;代码与顺序代码之间…

Linux微信运行错误,Ubuntu 16.04 运行微信开发者工具编译出错的解决办法

最近有折腾小程序的意向&#xff0c;但微信的开发者工具只提供了 Windows 和 Mac 两个版本&#xff0c;对于我这样的 Linux 用户来说不是那么地友好。经过观察发现&#xff0c;那个开发者工具实际上是基于nw.js开发的&#xff0c;天然地具有跨平台的属性&#xff0c;搜索Github…

springboot security 权限校验_springboot借助aop和注解实现权限校验

我们用springboot做后台开发&#xff0c;难免会用到权限校验&#xff0c;比如查看当前用户是否合法&#xff0c;是否是管理员。而spring的面向切面的特效可以帮助我们很好的实现动态的权限校验。这里我们就用到的spring的aop。接下来就带领大家用aop和注解来快速的实现权限校验…

linux 应用网络连接失败的原因,PuTTY网络错误:软件导致连接中止

解决PuTTY网络错误Software caused connection abort阅读有关该错误的PuTTY怎么说这是Windows网络代码由于某种原因而终止已建立的连接时所产生的一般错误。例如&#xff0c;如果将网络电缆从连接以太网的计算机背面拔出&#xff0c;或者Windows出于其他类似原因认为整个网络都…

javaone_替代JavaOne 2013

javaone我对无法参加JavaOne 2013感到很失望&#xff0c;但是很高兴看到涵盖这个年度会议的大量有用帖子。 在这篇文章中&#xff0c;我链接到许多此类资源&#xff0c;并提供了每篇文章相对于JavaOne 2013讨论内容的简短摘要。 主题演讲 主题演讲是“大公告”趋向于发生的地方…

electron sqlite3_electron集成sqlite3,win10上折腾了2天

要看解决办法的&#xff0c;直接把文章滚动到最后就行了&#xff0c;很简单。最近要做个 IM&#xff0c;PC 端选择用 electron&#xff0c;跨端的最佳选择了。桌面端项目&#xff0c;肯定少不了本地数据库&#xff0c;本来想用 sql.js&#xff0c;看了下需要手动拼接 SQL 语句&…

linux下客户端与ntp同步时间,如何在Windows客户端和Linux NTP服务器之间同步时间?...

我希望我的Windows 7机器能够从我的Linux Debian Sid服务器中获取时间.所以我想提前并从Debian存储库安装OpenNTPD.默认情况下它不会监听任何内容,因此我将其配置如下&#xff1a;listen on 192.168.0.1server 0.debian.pool.ntp.orgserver 1.debian.pool.ntp.orgserver 2.debi…

Java的最新发展– 2018年4月下旬

本周Java领域有一些最新的发展&#xff0c;我在本文中总结了其中的一些。 我们知道的JavaOne的终结 Stephen Chin在帖子“ JavaOne活动扩展了更多的曲目&#xff0c;语言和社区以及新名称 ”中说&#xff0c;“ JavaOne会议正在扩展以创建一个新的更大的活动&#xff0c;该活动…

arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值

系列文章《C语言经典100例》持续创作中&#xff0c;欢迎大家的关注和支持。喜欢的同学记得点赞、转发、收藏哦&#xff5e;后续C语言经典100例将会以pdf和代码的形式发放到公众号欢迎关注&#xff1a;计算广告生态 即时查收1 题目函数&#xff1a;max()、swap()功能&#xff1a…

linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc

PAGE天津电子信息职业技术学院《嵌入式软件编程》课程报告课程名称&#xff1a;基于linux的嵌入式串口通信课程代码&#xff1a; 115229姓 名&#xff1a; 甘琦学 号&#xff1a; 48专 业&#xff1a; 物联网应用技术班 级&#xff1a; 物联S14-1完成时间&#xff1a;2016 年 1…

红头文件rgb红色值_拿下抖音小姐姐,我写了个口红色号识别器

对于广大“钢铁直男”的程序员来说&#xff0c;送什么礼物给女朋友一直是个世纪难题。其实哄女朋友开心最深的套路就是花式送口红&#xff0c;就问谁抵挡得住啊啊啊啊......“没有什么问题是一支口红解决不了的&#xff0c;如果有&#xff0c;那就两支。”于是&#xff0c;直男…

zabbix监控suse linux,SuSE 系统之部署 Zabbix 监控服务

SuSE 系统之部署 Zabbix 监控服务2.4 安装 Apache2 httpd-2.4.2.tar.gz#tar?-zvxf?httpd-2.4.2.tar.gz??#./configure?--prefix/usr/local/services/apache2?--with-apr/usr/local/services/apr/?--with-apr-util/usr/local/services/apr-util/?--with-pcre/usr/local/…

java反射教程_Java反射教程

java反射教程在本教程中&#xff0c;我主要编写一些示例来介绍Java反射可以做什么。 希望它可以给您这个概念的概述。 请留下您的评论以寻求建议。 什么是反射&#xff1f; 简而言之&#xff0c;反射是程序在运行时检查和修改对象的结构和行为的能力。 这个概念有时与内省混合…

腾讯offer是什么样子_月薪35K:2020腾讯Java后端开发详细面试流程

背景2017年我毕业于某不知名二本院校&#xff0c;校招进入一安防企业; 从事于后台服务接入工作。期间一直不断的提高自己&#xff0c;终于在今年如愿以偿&#xff0c;获得腾讯后台开发岗位offer。因此想借此分享成长路上的思考与困难&#xff0c;以及腾讯面试的整个流程。同时在…

Spring Cloud简介–配置(第一部分)

1.概述 Spring Cloud为开发人员提供了工具&#xff0c;以快速构建分布式系统中的某些常见模式&#xff08;例如&#xff0c;配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局…

Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现

godbach2015-04-07 19:03yzh07137&#xff1a;你好&#xff0c;我看了你的这篇关于linux劫持open调用的文章[url]http://bbs.chinaunix.net/thread-1946913-1-1.html[/url](有点久远了)我在ubuntu12.04.5(内核是3.13.0.20-32-generic)上试验了&#xff0c;结果编译报错了&#…

python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃

On Windows 7 I successfully installed Python 3.73 and then installed Eric 6, the Python IDE. 安装似乎已成功&#xff0c;但是当我启动Eric时&#xff0c;将打开一个窗口&#xff0c;然后出现错误弹出窗口&#xff0c;提示Python已停止。 我非常感谢您为解决此问题提供的…

深度linux更新卡,深度操作系统已发布更新 新增“ apt-get custom-update”命令行

深度操作系统现已发布最新更新&#xff0c;新增“apt-getcustom-update”命令行&#xff0c;支持指定源更新&#xff0c;同时修复了关闭检查应用商店的应用更新后不生效的问题。此外&#xff0c;使用快捷键“ctrlaltR”进行录屏实际触发为截图的问题也已修复。值得一提的是&…