Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA和Hibernate为复合键实体创建@OneToOne Lazy fetch和optional=true关系_Java_Hibernate_Jpa_Spring Data Jpa_One To One - Fatal编程技术网

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

Java 如何使用JPA和Hibernate为复合键实体创建@OneToOne Lazy fetch和optional=true关系,java,hibernate,jpa,spring-data-jpa,one-to-one,Java,Hibernate,Jpa,Spring Data Jpa,One To One,我们有两个实体Student和StudentDetails。如何声明它们之间的@OneToOne关系 @Table(name = "STUDENTS") @Data @IdClass(value = Student.StudentId.class) public class Student implements Serializable { @Id @Column(name = "PARTITIONKEY") private Long partitionKey;

我们有两个实体
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关系应延迟加载
  • 只有孩子一方可以懒惰。对于父端,您需要使用启用并注释
    @OneToOne(mappedBy=“…”)
    字段

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

  • 主键由应用程序生成
  • 如果需要数据库自动生成PK,则不需要复合标识符。您只需在子端使用
    @MapsId
    即可共享自动生成的父标识符


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

    它与
    @embeddedableid
    一起工作,也就是说,我在这两个类中都使用了
    @embeddedableid
    ,并在
    StudentDetails
    中与@MapsId创建了@OneToOne关系,然后在插入
    StudentDetails
    时,我将
    Student
    作为参数传递。是否可以在
    学生
    班级中创建
    @OneToOne
    关系?这将简化我们的查询,因为
    Student
    和其他实体之间有更多的实体关系,我浏览了你们的博客,发现没有外键的OneToOne惰性初始化是不可能的,除非我们使用字节码增强。我们最终创建了OneToMany关联,并将该关联的getter更改为始终返回集合中的第一个对象。