栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Hibernate / WebApp上下文中的对象相等

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Hibernate / WebApp上下文中的对象相等

使用

id
实体的并不是一个好主意,因为临时实体还没有ID(并且您仍然希望临时实体可能等于持久性ID)。

使用所有属性(除了数据库标识符)也不是一个好主意,因为所有属性都不是标识的一部分。

因此,实现平等的首选(正确)方法是使用 业务密钥 ,如 Java Persistence with Hibernate中所述

用业务密钥实现平等

要获得我们推荐的解决方案,您需要了解业务密钥的概念。业务密钥是属性或属性的某种组合,对于具有相同数据库标识的每个实例都是唯一的。本质上,如果您不使用代理主键,那么它就是您要使用的自然键。与自然主键不同,并非绝对要求业务键永不更改-
只要它很少更改,就足够了。

我们认为,基本上每个实体类都应该具有一些业务密钥,即使它包含了该类的所有属性(这对于某些不可变的类也是适当的)。业务密钥是用户认为唯一标识特定记录的东西,而代理密钥是应用程序和数据库使用的东西。

业务密钥相等性意味着equals()方法仅比较构成业务密钥的属性。这是避免前面描述的所有问题的理想解决方案。唯一的缺点是,首先需要额外的思想来识别正确的业务密钥。无论如何,都需要这种努力。如果您的数据库必须通过约束检查确保数据完整性,则标识任何唯一键非常重要。

对于User类,

username
是一个很好的候选业务密钥。它永远不会为null,它具有数据库约束是唯一的,并且很少更改(如果有的话):

    public class User {        ...        public boolean equals(Object other) { if (this==other) return true; if ( !(other instanceof User) ) return false; final User that = (User) other; return this.username.equals( that.getUsername() );        }        public int hashCode() { return username.hashCode();        }}

也许我错过了一些东西,但是对于地址,业务密钥通常由街道号,街道,城市,邮政编码,国家/地区组成。我认为没有任何问题。

以防万一,Equals And
HashCode是另一个有趣的读物。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号