这个 JPA“缓存 hashCode”模式是否有任何问题?

2024-04-12

我当时在#hibernateIRC 和某人与我分享了以下(部分)模式

@Entity
public MyEntity() {

  ... primary key, object properties, getters/setters go here ...    

  @Column(nullable=false)
  private int hashCode;

  public MyEntity() {
     hashCode += id;
  }

  private final Set<String> tags = Sets.newHashSet();

  public void addTag(String tag) {
     if(tags.add(tag)) {
         hashCode += tag.hashCode();
     }
  }

  public void removeTag(String tag) {
     if(tags.remove(tag) {
        hashCode -= tag.hashCode();
     }
  }

  public void hashCode() {
    return hashCode;
  }

  ... http://www.artima.com/lejava/articles/equality.html style equals ...
}

人们可以将其称为“分段更新的缓存哈希码”。 (这绝对是NOT正如一些评论者似乎相信的那样,这是一种“业务关键”模式。 “业务键”模式需要一个具有唯一性约束的列,例如用户名,用于相等性测试)。

当在 JPA/Hibernate 中使用时,这意味着@Entitycan 具有与“eq/hC with buisness [sic] key”类似的优点JBoss Equals 和 HashCode 文章 https://community.jboss.org/wiki/EqualsAndHashCode,但其行为方式与开发人员期望的任何普通 Javabean 对象的行为方式相同(即不必将对象视为数据库行):在持久化到数据库之前;之后Transaction in EAGER获取模式;并随时与LAZY获取内部aTransaction or in EXTENDED mode.

然而,确保hashCode始终正确更新可能是一个真正的挑战。

这里有人对这种模式有任何经验吗?您能分享一下您对此的发现(积极的和消极的)吗?我对陷阱非常感兴趣,但我对那些声称某件事是“坏”而没有坚实的论据说明为什么它不好的评论完全不感兴趣。

请注意,我知道JPA hashCode() / equals() 困境 https://stackoverflow.com/questions/5031614,但我不认为该讨论实际上涵盖了这种模式。

这种模式最初被建议作为避免加载嵌套时出现问题的一种方法Collections in @Entitys,比如遇到Hibernate LazyInitializationException on find() 与 EAGER @ElementCollection https://stackoverflow.com/questions/11604370.

更新:一些评论者对现有方法变得非常热情。为了避免疑问,我只是对这种新模式的优点感兴趣。供您参考,并要求您停止说您认为应该如何实现 equals/hashCode,请注意,我在我的代码中使用了以下模式@Entity已经好几年了:

@Id
private UUID id = UUID.randomUUID();

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!(obj instanceof MY_CLASS) || id == null)
        return false;
    MY_CLASS other = (MY_CLASS) obj;
    return id.equals(other.id);
}

@Override
public int hashCode() {
    Preconditions.checkNotNull(id, "id must be set before @Entity.hashCode can be called");
    return id.hashCode();
}

我最近才尝试了一些新方法,看看我是否真的需要像这样的单独方法

public boolean hasSameProperties(Note other) {
    Preconditions.checkNotNull(other);
    if (this == other)
        return true;
    return Objects.equal(source, other.source)
            && Objects.equal(title, other.title)
            && Objects.equal(tags, other.tags)
            && Objects.equal(contents, other.contents);
}

这个业务键不是唯一的,因此对于 equals() 来说似乎是一个糟糕的选择。

业务密钥1002添加了标签500和标签-502,业务密钥995添加了标签3和标签2?这些对象真的是平等的吗?

32 位数字的冲突风险相对较低,无论您的特定实体服务于何种目的,都可以容忍,但将某些事物称为“模式”,人们希望它实际上是正确的,而不仅仅是对于给定的情况任意不可能失败数据大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个 JPA“缓存 hashCode”模式是否有任何问题? 的相关文章

随机推荐

  • 导入 CSS 最终出现错误

    最近我进入了这个网站 http thecodeplayer com 并发现了几个非常酷的设计 但在其中一些设计中 在 CSS 部分中有一段用于导入的代码片段 如下所示 import url http fonts googleapis com
  • 发送密钥后 Selenium WebElement 值为空

    我正在运行一些简单的表单测试 其中值是添加的字段 将每个值添加到字段后 input SendKeys value 我想检查该字段中的值是否正确 这听起来可能很不寻常 但该字段可能附加了 ajax 搜索 如果搜索没有返回匹配项 则该字段将为空
  • 如何在使用旧版本 gcc 的系统上动态链接到 libc.so.6、libstdc++.so.6 的本地副本

    我的代码是用 c 2011 编写的 并用 g 4 8 编译的 但是 我的系统管理员不会从 gcc g 4 1 升级计算集群 我收到以下错误 lib64 libc so 6 version GLIBC 2 14 not found requi
  • 如何检测文件名中的常见字符串组

    我正在尝试找出一种检测文件组的方法 例如 如果给定目录有以下文件 生日001 jpg 生日002 jpg 生日003 jpg Picknic1 jpg Picknic2 jpg 下午 jpg 我想将列表压缩为类似的内容 生日 3张 野餐 2
  • 在 Matlab 中按下某个键停止无限 while 循环

    我有一个无限的 while 循环 我想在按下键盘按键时停止它 伪代码 While 1 do stuff listening for key if key is pressed break end end 功能waitforbuttonpre
  • 使用JQUERY/JSON自动填充选择下拉框

    好吧 我花了很多时间查看示例 但找不到一个对我的情况有足够帮助的示例 我有一个 JSON 文件 对此示例进行了简化 Company Position Manager Name 11 joe 12 bill 166 John Position
  • 在没有“new List”的情况下初始化列表属性会导致 NullReferenceException

    using System using System Collections Generic class Parent public Child Child get set class Child public List
  • 您可以用 PHP 将送货地址传递给 Stripe Checkout 吗?

    我在用着Stripe 结帐 API https stripe com docs checkout integration builder指导网站用户付款 有没有办法将送货地址传递到托管结帐页面 以便从推荐人而不是 Stripe 本身收集该地
  • 如何使用 jquery 检测 IE11 [重复]

    这个问题在这里已经有答案了 我有代码 browser 来检测浏览器 并根据结果确定一些布局样式 但现在有了 ie 11 browser 将提供 mozilla v 11 有什么修复建议吗 尝试这个 var isIE11 navigator
  • 正则表达式太贪婪了

    我正在尝试编写一个正则表达式 但它太贪心了 输入字符串可以采用以下格式之一 STUFF 12 1234 or STUFF 1234 我想要做的是创建一个正则表达式来抓取最后一个之后的字符 所以在上面的例子中 这将是数字 1234 最后一个之
  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 如何通过命令查找mongodb数据和日志文件位置?

    如何通过命令查找mongodb数据和日志文件位置 就像下面的 SQL 服务器命令一样 从 sys database files 中选择 最简单的方法可能是getCmdLineOpts命令 db getSiblingDB admin runC
  • 不使用 pip 安装 pythonwheel 文件

    是否可以在不使用的情况下安装Python轮pip 我总是遇到安装问题pip 所以我通常通过复制和粘贴来手动安装库 我想知道是否有一种方法可以以类似的方式处理轮文件 我假设你有互联网接入 但是你没有有效的 pip 安装 下载点轮 wget h
  • 批处理核心数据获取结果

    我正在执行一个返回大约 2000 个实体的获取请求 目前 在我的设备上这大约需要 20 秒 所以我想我可以将获取限制设置为 100 然后当用户滚动到表视图的末尾时 获取接下来的 100 个实体 这可以通过使用来完成NSFetchReques
  • 不同的视图取决于 ContentControl (Caliburn.Micro)

    我将 ViewModel 绑定到 ContentControls 并让 Caliburn 负责创建和绑定视图 但是 我想根据我绑定到的 ContentControl 自定义 Caliburns ViewModel gt View 约定 例如
  • 如何从 xml 构建 .xsd 文件?

    有没有办法从 xml 文件生成 xsd 是否有任何类文件可以执行此操作 我不介意解决方案是 c 还是 java 我想用代码来做到这一点 但如果有任何好的免费工具也可以 Thanks xsd exe http msdn microsoft c
  • 如何伪造 Perl 钻石运算符的输入?

    这个问题的答案 https stackoverflow com questions 1213986 how can i fake stdin in perl描述如何伪造输入
  • Google API 获取文档/电子表格的内容

    我想将 Google 文档的内容显示到我自己的页面中 我可以使用以下方式获取所有文档的列表 http code google com apis documents docs 2 0 developers guide dotnet html
  • 在 Mac 上安装后使用 ALTER USER 语句重置 MySQL root 密码

    我最近安装了MySQL 安装后似乎必须重置密码 它不会让我做任何其他事情 现在我已经按照通常的方式重置了密码 update user set password password XXX where user root 顺便说一句 我花了很长
  • 这个 JPA“缓存 hashCode”模式是否有任何问题?

    我当时在 hibernateIRC 和某人与我分享了以下 部分 模式 Entity public MyEntity primary key object properties getters setters go here Column n