我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Hibernate检查id字段的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Hibernate检查id字段的方法是什么

这篇文章主要讲解了“Hibernate检查id字段的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate检查id字段的方法是什么”吧!

当你想要创建一个将其它域对象保存在Set,Map或是List里面的域对象时,这是一个问题。为了解决这个问题,你必须为你的所有对象提供一种equals()和hashCode()的实现,这种实现能够保证在它们在对象保存前后正确工作并且当对象在内存中时(返回值)不会改变。Hibernate参考文档提供了以下的建议:

“不要使用数据库标识符来实现等价的判断,而应该使用商业键值(business key),一种***的,通常不改变的属性的结合体。当一个buk不可序列化对象(transient object)被持久化的时候,数据库标识符会发生改变。当一个不可序列化实例(常常和detached instances在一起)被包含在一个Set里面时,哈希值的改变会破坏Set的从属关系。商业键值的属性并不要求和数据库主键一样稳定,你只要保证当对象在某个Set中时它们的稳定性。

“我们推荐判断商业键值的等价性来实现equals()和hashCode()两个方法。这意味着equals()方法只比较能够区分现实世界中的实例的商业键值(某个候选码)的属性。“(Hibernate 参考文档 v. 3.1.1).

换句话说,equals()和hashCode()使用商业键值进行处理,而对象使用Hibernate生成的键值作为id值。这要求对于每个对象有一个相关的不会改变的商业键值。可是,并不是每个对象类型都有这样的一种键,这时候你可能会尝试使用会改变但不时常改变的字段。这和商业键值不必和数据库主键一样稳定的思想相吻合。当对象在Collection中时候如果这种键不改变,那它们似乎就“足够好”了。这是一种危险的主张,这意味着你的应用程序可能不会崩溃,但是前提是没有人在特定的情况下更新了特定的字段。所以,应当有一种更好的解决方案,而它确实也存在。试图创建和维护在对象和数据库行两者间有着分离的定义的标识符是目前为止讨论的所有问题的根源。如果我们统一所有标识符的形式,这些问题都将不复存在。也就时说,作为以数据库为中心和以对象为中心的标识符的替代品,我们应该创建一种通用的,特定于实体的ID来代表数据实体,这种ID应该在数据***次输入的时候产生。无论一个***数据实体是保存在数据库,是作为对象驻留在内存,还时存贮在其它格式的介质中,这个通用ID都应该可以识别它。通过使用数据实体***次创建时指派的ID,我们可以安全的回到我们对equals()和hashCode()的原始定义。它们只是简单地使用了这个id:

public class Person {   // assign an id as soon as possible   private String id = IdGenerator.createId();   private Integer version;  public String getId() { return id; }   public void setId(String id) {   this.id = id;  }  public Integer getVersion() {  return version;  }  public void setVersion(Integer version) {  this.version = version;  }  // Person-specific fields and behavior here   public boolean equals(Object o) {   if (this == o) return true;   if (o == null || !(o instanceof Person)) return false;   Person other = (Person)o;   if (id == null) return false;   return id.equals(other.getId());   }  public int hashCode() {  if (id != null) {   return id.hashCode();   } else {  return super.hashCode();   }  }  }

这个例子使用id作为equals() 方法判断等价的标准以及hashCode()返回哈希值的来源。这就简单了许多。但是,要让它正常工作,我们需要两样东西。首先,我们需要保证每个对象在被保存之前都有一个id值。在这个例子里,当id变量被声明的时候,它就被指派了一个值。其次,我们需要一种判断这个对象是新生成的还是之前保存过的的手段。在我们最早的例子中,Hibernate检查id字段是否为空来判断对象是否时新生成的。既然我们的对象id永远不为空,这个方法显然不再有效。为了解决这个问题,我们可以很容易的配置Hibernate,让它检查version字段,而不是id字段是否为空。version字段是一个更为恰当的用来判断你的对象是否被保存过的指示器。

下面是我们改进过的Person类的Hibernate映射文件。

<?XML version="1.0"?>  <hibernate-mapping package="my.package">  <class name="Person" table="PERSON">  <id name="id" column="ID">  <generator class="assigned" />  </id>   <version name="version" column="VERSION" unsaved-value="null" />   <!-- Map Person-specific properties here. -->  </class>  </hibernate-mapping>

注意,id下面的generator标签包含了属性class="assigned".这个属性告诉Hibernate我们不是让数据库指派id值而是在我们的代码里面指派id值。Hibernate会简单地认为即使是新的,没有经过保存的对象也有id值。我们也给version标签新增了一个unsaved-value="null"的属性。这个属性告诉Hibernate应该把version值而不是id值为null作为对象是新创建而成的指示器。我们也可以简单的告诉Hibernate把负值作为对象未经保存的指示器,如果你喜欢把version字段的类型设置为int而不是Integer,这将是很有用的。

感谢各位的阅读,以上就是“Hibernate检查id字段的方法是什么”的内容了,经过本文的学习后,相信大家对Hibernate检查id字段的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Hibernate检查id字段的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Hibernate检查id字段的方法是什么

这篇文章主要讲解了“Hibernate检查id字段的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate检查id字段的方法是什么”吧!当你想要创建一个将其它域对象保存在
2023-06-17

MYSQL插入数据时检查字段值是否重复的方法是什么

这篇“MYSQL插入数据时检查字段值是否重复的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MYSQL插入数据时检
2023-06-26

mybatis动态字段查询的方法是什么

MyBatis提供了动态字段查询的方法,可以根据不同的条件动态选择需要查询的字段。以下是MyBatis中实现动态字段查询的方法:1. 使用``标签实现动态字段查询:```xmlSELECTidname*FROM user```在上述示例中,
2023-09-29

mongodb查询某个字段的方法是什么

在 MongoDB 中查询某个字段可以使用以下方法:db.collection.find({fieldName: value})其中,db.collection 是要查询的集合,fieldName 是要查询的字段名称,value 是要匹配
mongodb查询某个字段的方法是什么
2024-03-08

jpa查询指定字段的方法是什么

在JPA中,可以使用以下方法来查询指定字段:1. 使用JPQL查询语句:可以使用SELECT关键字来指定需要查询的字段,例如:```java@Query("SELECT u.name FROM User u")List findUserNa
2023-09-13

sql字段拼接查询的方法是什么

在 SQL 中,可以使用 CONCAT 函数来拼接字段查询。例如,假设有两个字段 first_name 和 last_name,要将它们拼接为一个名字字段,可以使用以下 SQL 查询语句:SELECT CONCAT(first_name,
sql字段拼接查询的方法是什么
2024-03-04

mysql多字段模糊查询的方法是什么

在MySQL中进行多字段模糊查询的方法是使用OR运算符连接多个LIKE条件。例如,假设有一个名为users的表,其中包含name和email两个字段,我们想要同时在这两个字段中进行模糊查询,可以使用以下语句:SELECT * FROM
mysql多字段模糊查询的方法是什么
2024-04-09

mysql查询字段不为空的方法是什么

在MySQL中,可以使用IS NOT NULL来查询字段不为空的记录。例如,假设我们有一张名为users的表,其中有一个字段email表示用户的email地址。我们想要查询所有email地址不为空的用户,可以使用以下SQL语句:SELE
mysql查询字段不为空的方法是什么
2024-03-02

mongodb查询字段不为空的方法是什么

在MongoDB中,可以使用$exists操作符来查询字段不为空的文档。$exists操作符可以与其他查询操作符一起使用,例如$eq操作符、$ne操作符等,以进一步过滤查询结果。以下是使用$exists操作符查询字段不为空的示例:db.co
2023-09-12

thinkphp查询指定字段值的方法是什么

这篇文章主要介绍“thinkphp查询指定字段值的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkphp查询指定字段值的方法是什么”文章能帮助大家解决问题。第一步:连接数据库在使用
2023-07-05

es查询返回指定字段的方法是什么

在Elasticsearch中,要返回指定字段的方法是使用source过滤器。 source过滤器允许你在搜索请求中指定要返回的字段列表,从而减少返回结果的大小并提高性能。你可以通过_source参数来指定要返回的字段列表,也可以在查询请
2023-10-24

sqlserver检查约束的方法是什么

在 SQL Server 中,可以使用以下两种方法来检查约束:使用系统存储过程 sp_helpconstraint:这个存储过程可以返回指定表的约束信息,包括约束的名称、类型、列名等。可以通过执行以下命令来查看表的所有约束信息:EXEC s
sqlserver检查约束的方法是什么
2024-03-06

oracle字段转换的方法是什么

在Oracle数据库中,可以使用一些内置的函数来转换字段的数据类型或格式。以下是一些常用的方法:TO_CHAR:将日期、数字等数据类型转换为字符型数据。例子:SELECT TO_CHAR(date_column, ‘YYYY-MM-DD’
oracle字段转换的方法是什么
2024-03-15

mysql添加字段的方法是什么

要在MySQL数据库中添加字段,可以使用ALTER TABLE语句。以下是一个示例:ALTER TABLE table_nameADD column_name data_type;例如,如果要向名为users的表中添加一个名为email
mysql添加字段的方法是什么
2024-04-09

oracle字段拼接的方法是什么

在Oracle中,可以使用"||"运算符来实现字段拼接。这个运算符可以用于连接两个字符串或者字段,返回一个新的字符串。例如,可以使用以下语法来拼接两个字段:SELECT column1 || column2 AS new_column
oracle字段拼接的方法是什么
2024-04-09

mongodb对日期字段模糊查询的方法是什么

在MongoDB中,可以使用正则表达式对日期字段进行模糊查询。具体方法如下所示:1. 使用 `$regex` 操作符配合正则表达式进行模糊查询。例如,假设日期字段名为 `dateField`,要查询以 "2021" 开头的日期,可以使用以下
2023-09-06

json添加字段的方法是什么

在 JSON 中添加字段有以下几种方法:1. 使用点运算符(.):可以直接通过点运算符将字段添加到 JSON 对象中。例如:```var json = { "name": "John" };json.age = 25;console.log
2023-08-09

sqlserver拼接字段的方法是什么

在SQL Server中,可以使用+操作符或CONCAT函数来拼接字段。使用+操作符拼接字段:SELECT column1 + column2 AS concatenated_columnFROM table_name;例如:SELEC
sqlserver拼接字段的方法是什么
2024-04-09

sqlserver删除字段的方法是什么

要删除 SQL Server 数据表中的字段,可以使用 ALTER TABLE 语句并指定 DROP COLUMN 关键字,示例如下:ALTER TABLE table_nameDROP COLUMN column_name;其中,t
sqlserver删除字段的方法是什么
2024-03-15

oracle增加字段的方法是什么

Oracle增加字段的方法有以下几种:使用ALTER TABLE语句:ALTER TABLE table_name ADD (column_name data_type);例如,要在名为table_name的表中添加名为column_na
oracle增加字段的方法是什么
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录