Hibernate 如何在具有复合主键的实体中重写equals/hashCode?
我有一个带有复合主键的表,包括它自己的主键和来自其他表的FK 我决定不使用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
@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
我必须指出,这个决定有两个缺点:
@实体
@表(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值。(请参阅)。这是否回答了您的问题@斯特恩:谢谢你的链接。不幸的是,我认为情况不尽相同。