hibernate复合键

是否有必要将composite-id映射到类?

可以这样吗?

    

或应该是

     

如果有必要,如果我们有复合键,那么该类应该实现equals()override()方法?

Hibernate需要能够比较和序列化标识符。 因此标识符类必须是可序列化的,并且与数据库的复合键相等概念一致地重写hashCode()和equals()。

如果您将复合ID映射为实体的属性,则实体本身就是标识符。

第二种方法称为映射复合标识符,其中在元素内命名的标识符属性在持久化类和单独的标识符类上都是重复的

最后,composite-id可以是组件类。 在这种情况下,组件类是标识符类。

请注意,强烈建议将ID作为单独的类。 否则,您将只使用session.get()或session.load()查找对象的方法非常笨拙。

参考文档的相关部分:

  • 复合ID
  • 组件作为复合标识符

在此示例中,composite-id被映射为实体的属性。 (以下假设您正在定义Employee类)。

     class EmployeeAssignment implements Serializable { string getEmployeeNumber() void setEmployeeNumber( string value ) string getDepartment() void setDepartment( string value ) boolean equals( Object obj ) int hashCode() } 

映射的composite-id:

     class EmployeeAssignment { string getEmployeeNumber() void setEmployeeNumber( string value ) string getDepartment() void setDepartment( string value ) } class EmployeeAssignmentId implements Serializable { string getEmployeeNumber() void setEmployeeNumber( string value ) string getDepartment() void setDepartment( string value ) boolean equals( Object obj ) int hashCode() } 

作为composite-id的组件:

     class EmployeeAssignment { EmployeeAssignmentId getId() void setId( EmployeeAssignmentId value ) } class EmployeeAssignmentId implements Serializable { string getEmployeeNumber() void setEmployeeNumber( string value ) string getDepartment() void setDepartment( string value ) boolean equals( Object obj ) int hashCode() } 

两者都是可能的。 如果你使用

     

然后,不需要单独的类来表示密钥。 ID值取自实体本身的属性。

如果你使用

     

然后,指定的类将用作键属性的持有者。 但是,实体类必须具有这些属性 – 值存储在实体类和复合ID类中。 实体类不知道密钥类。 在我看来,不是很好。

有一个更好的第三种方法,在这里的文档中描述:

      

这里,复合键由OrderLineId类表示,其实例存储在实体类中的字段id下。 这使实体和密钥之间的分离更加清晰。

如果您有一个包含与其他实体的关系的复合键,请执行以下操作: