我们有 2 个实体 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 关系应该延迟加载
- 可插入 = false 且可更新 = false。
- 主键由应用程序生成
- 库,使用的数据库有Spring data JPA、内存数据库H2、MySQL、Hibernate 5
最佳答案
- @OneToOne relationship should be lazily loaded
只有子端可以是LAZY。对于父端,需要开启 bytecode enhancement
并使用 @LazyToOne(LazyToOneOption.FALSE)
注释 @OneToOne(mappedBy="...")
字段.
- insertable = false and updatable=false.
仅当您将同一列映射到两个实体属性时才需要此请求。就您而言,不需要。
- Primary keys are generated by the application
如果您需要数据库自动生成PK,则不需要复合标识符。您可以在子端使用 @MapsId
来共享自动生成的父标识符。
现在,您最好使用 @Embeddable
来保存复合标识符,而不是使用多个 @Id
注释。 @EmbeddedId
将使定位实体变得更加容易。否则,您需要使用实体来存储 id,以便从数据库中获取实际实体。
关于java - 如何使用 JPA 和 Hibernate 为复合键实体创建 @OneToOne Lazy fetch 和 optional = true 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53923203/