Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何在具有复合主键的实体中重写equals/hashCode?_Hibernate_Jpa_Equals_Hashcode_Composite Primary Key - Fatal编程技术网

Hibernate 如何在具有复合主键的实体中重写equals/hashCode?

Hibernate 如何在具有复合主键的实体中重写equals/hashCode?,hibernate,jpa,equals,hashcode,composite-primary-key,Hibernate,Jpa,Equals,Hashcode,Composite Primary Key,我有一个带有复合主键的表,包括它自己的主键和来自其他表的FK 我决定不使用@IdClass或@EmbeddedId class-SomeEntity{ @身份证 私有字符串someId; @身份证 @多通(可选=假) @JoinColumn(名称=…) 私人其他 //这里还有其他映射 } Hibernate警告这些 WARN 69752 ... : HHH000038: Composite-id class does not override equals(): ....Some WARN 6

我有一个带有复合主键的表,包括它自己的主键和来自其他表的FK

我决定不使用
@IdClass
@EmbeddedId

class-SomeEntity{
@身份证
私有字符串someId;
@身份证
@多通(可选=假)
@JoinColumn(名称=…)
私人其他
//这里还有其他映射
}
Hibernate警告这些

WARN 69752 ... : HHH000038: Composite-id class does not override equals(): ....Some
WARN 69752 ... : HHH000039: Composite-id class does not override hashCode(): ....Some
我应该如何实现这两种方法

我可以只包括这两个字段吗?其他领域呢

@覆盖
公共布尔等于(对象o){
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
有些是=(有些)o;
返回Objects.equals(someId,that.someId)&&
对象。等于(其他,那个。其他);
}
@凌驾
公共int hashCode(){
返回Objects.hash(someId,other);
}
我决定不使用
@IdClass
@EmbeddedId

我必须指出,这个决定有两个缺点:

  • JPA规范不允许这种方法,因此它是特定于hibernate的解决方案。(见附件)
  • 实体实例和实际标识符之间没有分离。要查询此实体,必须向持久性上下文提供实体本身的实例。(见附件)
  • 想象一下,您拥有以下实体:

    @实体
    @表(name=“TST\U FIRST\U ENTITY\U EHC”)
    公共类FirstEntity实现可序列化
    {
    @身份证
    @列(name=“fst\u id”)
    私人长id;
    @归化
    @列(name=“fst\u代码”)
    私有字符串码;
    @身份证
    @多通(可选=假)
    @JoinColumn(name=“fst\u sec\u id”)
    私人第二实体第二实体;
    公共实体()
    {
    }
    public FirstEntity(长id、长secId)
    {
    this.id=id;
    secondEntity=新的secondEntity();
    secondEntity.setId(secId);
    }
    // ...
    }
    
    要通过PK查找此实体,您应该编写如下内容:

    FirstEntity item=session.find(FirstEntity.class,新的FirstEntity(1L,2L));
    
    对我来说,这看起来很尴尬

    至于您的主要问题,您可以使用标识实体的任何字段集。 想象一下,对于上述实体,您拥有以下DDL SQL:

    创建表TST\u FIRST\u ENTITY\u EHC
    (
    fst_id bigint,
    fst_secu_id bigint,
    fst_代码varchar(25),
    fst_值varchar(500),
    主键(fst_id、fst_sec_id),
    唯一(fst_代码),
    外键(fst_sec_id)引用TST_SECOND_ENTITY_EHC(sec_id)
    );
    

    您可以基于
    id
    secondEntity.id
    字段或基于
    code
    字段实现实体的
    equals
    hashCode
    。基于自然id或业务密钥的方法更可取,因为如果使用数据库id生成,则在提交JPA事务之前无法知道实际的id值。(请参阅)。

    这是否回答了您的问题@斯特恩:谢谢你的链接。不幸的是,我认为情况不尽相同。