如何使用JPA和Hibernate为复合密钥实体创建@OneToOne Lazy fetch和option=true关系



我们有两个实体StudentStudentDetails。如何声明他们之间的@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;
}
}
  1. @OneToOne关系应惰性加载
  2. insertable=false和updateable=false
  3. 主键由应用程序生成
  4. 库,使用的数据库有Spring数据JPA、H2内存数据库、MySQL、Hibernate 5
  1. @OneToOne关系应该延迟加载

只有儿童侧可以是LAZY。对于父端,您需要启用bytecode enhancement并用@LazyToOne(LazyToOneOption.FALSE)注释@OneToOne(mappedBy="...")字段。

  1. insertable=false和updateable=false

只有在将同一列映射到两个实体属性时才需要此请求。在你的情况下,这是不需要的。

  1. 主键由应用程序生成

如果需要由数据库自动生成PK,则不需要复合标识符。您可以在子端使用@MapsId来共享自动生成的父标识符。

现在,您最好使用@Embeddable来保存复合标识符,而不是使用多个@Id注释。@EmbeddedId将使定位实体更加容易。否则,您需要使用一个实体来存储id,只是为了从数据库中获取实际的实体。

最新更新