相关疑难解决方法(0)

617
推荐指数
11
解决办法
57万
查看次数

JPA hashCode()/ equals()两难

这里有一些 关于JPA实体的讨论,以及哪些hashCode()/ equals()实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).

所有可能的实现都有各自的优点缺点:

  • hashCode()/equals()合同一致性(不变性)为List/ Set操作
  • 是否可以检测到相同的对象(例如来自不同会话,来自延迟加载的数据结构的动态代理)
  • 实体是否在分离(或非持久)状态下正常运行

据我所知,有三种选择:

  1. 不要覆盖它们; 依靠Object.equals()Object.hashCode()
    • hashCode()/ equals()工作
    • 无法识别相同的对象,动态代理的问题
    • 分离实体没有问题
  2. 根据主键覆盖它们
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体的问题
  3. 根据Business-Id(非主键字段;外键怎么办?)覆盖它们.
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体没有问题

我的问题是:

  1. 我错过了一个选项和/或pro/con点吗?
  2. 您选择了什么选项?为什么?



更新1:

通过" hashCode()/ equals()被破坏",我的意思是连续hashCode()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map, Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …

java identity hibernate jpa eclipselink

296
推荐指数
9
解决办法
8万
查看次数

我是否使用Google Guava正确实现了equals和hashCode?

我正在使用hibernate并需要覆盖equals和hashCode().我选择使用google-guava的equals和hashCode助手.

我想知道我在这里是否遗漏了什么.

我有id/imagefilePath的 get/set方法.

@Entity
@Table(name = "IMAGE")
public class ImageEntity {
    private Integer idImage;
    private String filePath;

    @Override
    public int hashCode() {
        return Objects.hashCode(getFilePath());
    }

    @Override
    public boolean equals(final Object obj) {
        if(obj == this) return true;
        if(obj == null) return false;

        if(obj instanceof ImageEntity){
            final ImageEntity otherImage = (ImageEntity) obj;
            return Objects.equal(getFilePath(), otherImage.getFilePath());
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

进入继承并在这里有一个样本

java equals hashcode guava

10
推荐指数
2
解决办法
7974
查看次数

域驱动设计中的实体

我正在阅读Eric Evans关于DDD的书,我对以下引用有疑问.equals()如果不使用属性,如何制作方法?我正在使用JPA,并且我有一个唯一的id属性,但在实际持久保存实体之前不会设置.所以你会怎么做?我已经基于属性实现了equals方法,我理解为什么你不应该因为它在我的项目中失败了.

关于实体的部分:

当一个对象通过其标识而不是其属性进行区分时,将该主要对象定义为模型中的定义.保持课堂定义简单,重点关注生命周期的连续性和身份.定义区分每个对象的方法,无论其形式或历史如何.警告要求按属性匹配对象的要求.定义一个保证为每个对象生成唯一结果的操作,可以通过附加保证唯一的符号.这种识别方法可能来自外部,也可能是由系统创建的任意标识符,但它必须与模型中的标识区别相对应.模型必须定义相同的东西意味着什么.

http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215

java domain-driven-design java-ee

5
推荐指数
1
解决办法
1733
查看次数