我有以下两个实体:
@Entity(name = "Employee")
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {
@Id
@Column(name = "EMP_ID", insertable = true, updatable = false, nullable = false)
private int id;
和
@Entity(name = "Draw")
@Table(name = "DRAW")
public class Draw extends AuditableEntity {
@Id
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "EMP_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.MERGE})
private Employee employee = null;
我们可以说这就是他们想要的建模方式。这是指定的OneToOne关系。然而,当我去测试时,我得到了以下错误:
嵌套异常为org.springframework.beans.factory.BeanCreationException:创建类路径资源[META-INF/spring/datasource context.xml]中定义的名称为"sessionFactory"的bean时出错:调用init方法失败;嵌套异常为org.hubinate.MappingException:复合id类必须实现Serializable.com.myprojects.tet.data.entity.Draw
为什么Draw
中的employee
密钥被解释为复合id?以及如何修复此错误。我已经读到引用的实体必须是可序列化的,但它也需要实现方法equals
和hashCode
(我还没有实现)。这两个的实现是否应该修复这个错误?
为清晰起见进行编辑:
我有两个模型表:EMPLOYEE
和DRAW
:
EMPLOYEE
有:整数emp_id
,加上许多其他列。
DRAW
具有:整数emp_id
、整数totalPoints
。
绘图表将每隔一段时间进行填充和清除,因此列totalPoint
不能在表EMPLOYEE
中。我不确定我的实体关系是否正确(即,将实体employee
作为draw
的id)。
用@PrimaryKeyJoinColumn
:替换@JoinColumn
@Id
@Column(name = "EMP_ID")
private int id;
@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@PrimaryKeyJoinColumn(name = "EMP_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.MERGE})
private Employee employee;