我正在学习休眠状态。我知道,当我们需要一个复合主键时,我们会将这些变量放在必须实现可序列化的类中。除了复合主键(即数据类型原语或Wrapper类的单个主键)以外,它们直接或间接实现可序列化接口。到目前为止,我可以,但是我的问题是为什么我们需要实现可序列化的接口?在休眠中实现可序列化接口的目的是什么?
答案 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
}
}
重写的方法定义了用于确定员工密钥是否彼此相等的契约,并生成哈希码以在休眠侧唯一地标识每个员工密钥。