为什么主键必须在休眠状态下实现Serializable接口?

时间:2019-05-22 15:31:16

标签: hibernate

我正在学习休眠状态。我知道,当我们需要一个复合主键时,我们会将这些变量放在必须实现可序列化的类中。除了复合主键(即数据类型原语或Wrapper类的单个主键)以外,它们直接或间接实现可序列化接口。到目前为止,我可以,但是我的问题是为什么我们需要实现可序列化的接口?在休眠中实现可序列化接口的目的是什么?

1 个答案:

答案 0 :(得分:1)

必须使用复合主键实现可序列化的接口,以便可以唯一地标识具有复合主键的类的实例。

可序列化的接口允许hibernate将对象作为数据库中的一行与数据库中的所有其他行进行比较。

考虑以下代表employee表的kotlin实体类:

@Entity
@Table(name = "Employee")

class Employee (

        @EmbeddedId
        var employeeKey: EmployeeKey
)

EmployeeKey是一个组合键类,如下所示:

@Embeddable
class EmployeeKey(

        @Column(name = "first_name")
        var firstName: String,

        @Column(name = "last_name")
        var lastName: String,

        @Column(name = "employee_id")
        var employeeId: Long

) : Serializable {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as EmployeeKey

        if (firstName != other.firstName) return false
        if (lastName != other.lastName) return false
        if (employeeId != employeeId) return false

        return true
    }

    override fun hashCode(): Int {
        var result = firstName.hashCode()
        result = 31 * result + lastName.hashCode()
        result = 31 * result + employeeId.hashCode()
        return result
    }
}

重写的方法定义了用于确定员工密钥是否彼此相等的契约,并生成哈希码以在休眠侧唯一地标识每个员工密钥。