【问题标题】:How to create @OneToOne Lazy fetch and optional = true relationship for composite key entities with JPA and Hibernate如何使用 JPA 和 Hibernate 为复合键实体创建 @OneToOne Lazy fetch 和 optional = true 关系
【发布时间】:2019-05-24 04:39:03
【问题描述】:

我们有 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;
    }
}
  1. @OneToOne 关系应该延迟加载
  2. insertable = false 和 updatable=false。
  3. 主键由应用程序生成
  4. 使用的库、数据库有 Spring data JPA、H2 in memory 数据库、MySQL、Hibernate 5

【问题讨论】:

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


    【解决方案1】:
    1. @OneToOne 关系应该被延迟加载

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

    1. insertable = false 和 updatable=false。

    仅当您在两个实体属性上映射同一列时才需要此请求。在你的情况下,它是不需要的。

    1. 主键由应用程序生成

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

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

    【讨论】:

    • 它与@EmbeddableId 以一种方式工作,即我在两个类中都使用了@EmbeddableId,并在StudentDetails 中与@MapsId 创建了@OneToOne 关系,然后在插入StudentDetails 时我通过了@ 987654334@ 作为参数。是否可以在 Student 类中创建 @OneToOne 关系?这将简化我们的查询,因为Student 和其他实体之间存在更多的实体关系。
    • 嗨,Vlad,我浏览了你的博客,发现没有外键的 OneToOne LAZY 初始化是不可能的,除非我们使用字节码增强。
    • 我们最终创建了一个 OneToMany 关联,并将该关联的 getter 更改为始终返回集合中的第一个对象。
    猜你喜欢
    • 2021-05-22
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多