我们有两个实体Student
和StudentDetails
。如何声明他们之间的@OneToOne关系?
@Table(name = "STUDENTS")
@Data
@IdClass(value = Student.StudentId.class)
public class Student implements Serializable {
@Id
@Column(name = "PARTITIONKEY")
private Long partitionKey;
@Id
@Column(name = "STUDENTKEY")
private Long studentKey;
@Data
@NoArgsConstructor
public static class StudentId implements Serializable {
private Long partitionKey;
private Long studentKey;
}
}
@Table(name = "STUDENTDETAILS")
public class StudentDetails implements Serializable {
@Id
@Column(name = "PARTITIONKEY")
private Long partitionKey;
@Id
@Column(name = "STUDENTKEY")
private Long studentKey;
@Data
@NoArgsConstructor
public static class StudentDetailsId implements Serializable {
private Long partitionKey;
private Long studentKey;
}
}
- @OneToOne关系应惰性加载
- insertable=false和updateable=false
- 主键由应用程序生成
- 库,使用的数据库有Spring数据JPA、H2内存数据库、MySQL、Hibernate 5
- @OneToOne关系应该延迟加载
只有儿童侧可以是LAZY。对于父端,您需要启用bytecode enhancement
并用@LazyToOne(LazyToOneOption.FALSE)
注释@OneToOne(mappedBy="...")
字段。
- insertable=false和updateable=false
只有在将同一列映射到两个实体属性时才需要此请求。在你的情况下,这是不需要的。
- 主键由应用程序生成
如果需要由数据库自动生成PK,则不需要复合标识符。您可以在子端使用@MapsId
来共享自动生成的父标识符。
现在,您最好使用@Embeddable
来保存复合标识符,而不是使用多个@Id
注释。@EmbeddedId
将使定位实体更加容易。否则,您需要使用一个实体来存储id,只是为了从数据库中获取实际的实体。