0 java spring equals hashcode lombok
我在 Java 应用程序的每个 Hibernate 实体(如果没有继承)中创建equals()和方法。hashCode()然而,我有点困惑,想确定我的定义是否正确。您能否澄清以下问题?
在 IntelliJ 中,当我使用“生成”功能(通过 Alt + Insert)时,有一些模板,例如 IntelliJ Default、Java 7+ 等。我应该使用哪个模板?
使用“生成”功能时,我应该在equals() and hashCode()以下实体的方法中包含哪个字段?
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@Column(unique = true)
private String email;
// getter, setter, constructor...
}
Run Code Online (Sandbox Code Playgroud)
我应该使用注释来实现简单易用吗@EqualsAndHashCode?或者它不灵活,我应该更喜欢明确地实施吗?
一个需要考虑的相当关键的问题是User对象代表什么。
这意味着如果unid未设置(即您还没有save()设置它),则没有两个用户对象可以彼此相同。毕竟,如果您创建 User 的 2 个实例,将每个值(除了id您不乱用的值除外)设置为相同的值,然后 save() 两者,您将拥有 2 行:从而证明它们不相同。但是,为了遵守 java 规则,如果存在引用标识(即this == other),它们将是相同的。
当unid 设置时,决定两个User对象是否相同的唯一因素是它们的 unid 是否相同。所有其他属性都是无关紧要的 - 毕竟,如果您查询同一数据库的同一行(User为每个行获取一个单独的实例,具有相同的值),然后您setEmail在其中一个属性上,那么该email字段不再相同,而是没关系:它们引用同一行,保存一个和其他更改,因此,它们是相同的。
结论:编写您自己的 equals 方法,如下所示:
if (other == null) return false;
if (other.getClass() != User.class) return false;
if (this == other) return true;
if (this.id == null || other.id == null) return false;
return this.id.equals(other.id);
Run Code Online (Sandbox Code Playgroud)
hashCode 可以只是id.hashCode(),返回0或31如果您愿意(或任何其他质数,在实践中不会产生太大差异) ifid为 null。
在这种情况下,事实上,您可以使用save()它们,并且它们也有一个id表示与用户完全无关的内容,仅表示后备存储系统的“实现细节”,您将比较除以下内容之外的 id所有内容- 名称为任何 2 个 User 对象和 email 是 equal, are equal,即使对象碰巧代表 2 个单独的行(不知何故 - 你对电子邮件有唯一性约束。但你仍然可以实现这一点 - 创建一个你尚未保存的新实例,在保存之前不会发生 SQLException)。
是的。他们是。很烦人,不是吗?一个只检查id,另一个检查除此之外的所有内容id。
Hibernate/JPA 对它认为自己想要的东西感到困惑,将自己作为数据库抽象(第一个“采取”)和对象持久性框架(它更接近第二种情况)兜售,因此我仍然没有'实际上没有看到这两个视图中哪一个是 hibernate“首选”的。
因此,呃..我猜选一个。我认为第一个更加“正确”,并且更有可能做你想做的事情(请记住,点击每个属性可能会导致选择中的级联来获取所有这些值,特别是如果你有互连的东西,即引用对于其他表,这是第一个视图“更好”的几个原因之一),但是,根据我的经验,它的部署较少。
如果你想选择第二个选项,你可以使用 lombok 的东西。请务必用id进行标记@EqualsAndHashCode.Exclude。对于第一个 - 自己编写更容易,请参阅上面的代码片段。
| 归档时间: |
|
| 查看次数: |
975 次 |
| 最近记录: |