java - 如何使用 JPA 和 Hibernate 为复合键实体创建 @OneToOne Lazy fetch 和 optional = true 关系

标签 java hibernate jpa spring-data-jpa one-to-one

我们有 2 个实体 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. 可插入 = false 且可更新 = false。
  3. 主键由应用程序生成
  4. 库,使用的数据库有Spring data JPA、内存数据库H2、MySQL、Hibernate 5

最佳答案

  1. @OneToOne relationship should be lazily loaded

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

  1. insertable = false and updatable=false.

仅当您将同一列映射到两个实体属性时才需要此请求。就您而言,不需要。

  1. 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/

相关文章:

java - 封装别名字段的 JPQL 函数

java - 使用@Singleton 和@Stateless 加载和缓存应用程序范围的数据

java - 从 JAR 文件外部加载资源文件

java - Java泛型中删除的概念是什么?

java - hibernate 问题

hibernate - Grails应用启动太慢

java - 使用 JPA 显示 Vaadin 网格中的一些列

java - Spring Data JPA 存储库 Multi-Tenancy 单模式技术

java - 最小化停靠时设置类似mac的图标

java - 异构二叉搜索树