【问题标题】:Spring Data JPA: How to join two entities using annotationsSpring Data JPA:如何使用注释连接两个实体
【发布时间】:2020-05-29 00:22:53
【问题描述】:

我有两个实体(学生和项目),想通过外键加入他们“student_id”

@Entity
@Data
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private Long student_id;
}
@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany
    private List<Project> projects;
}

简单地说,当我向学生存储库发送 GET 请求时,我想让学生获得项目列表。

例如;

// > json for POST to Project
{
    "title":"java",
    "student_id":1
}
// > json for POST to Student
{
    "name":"Bill Gates"
}

当我向 Student 发送 GET 请求时,我希望看到的内容如下所示;

[
   {
      "id":1,
      "name":"java",
      "projects":[
         {
            "id":1,
            "title":"java"
         }
      ]
   }
]

仅使用 JPA 注释是否适用?提前致谢。

【问题讨论】:

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


    【解决方案1】:

    是的,它适用。 首先,您需要在 Project 类中将 student_id 更改为这样的学生类

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "student_id",nullable = false)
    private Student student;
    

    其次,你需要给你的oneToMany注解添加'map'参数

    @OneToMany(mappedBy = "student")
    private List<Project> projects;
    

    就是这样。

    旁注:如果可以将多个学生分配给同一个项目,您也可以考虑多对多关系

    【讨论】:

    • 嗨 Hesham,感谢您的快速回答,但我想它会以无限循环结束,因为“项目”实体调用“学生”并且“学生”再次调用项目。这就是为什么我想使用一个长变量“student_id”作为外键。
    • 你可以像这样使用lazy作为获取类型@ManyToOne(fetch=FetchType.LAZY)@JoinColumn(name = "student_id",nullable = false) private Student student;
    • 这将解决无限循环问题,如果有的话。还请记住,对项目端点的发布请求将类似于 { "title":"java", "student":{"id":1} }
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2018-10-01
    • 2017-11-08
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2012-08-06
    相关资源
    最近更新 更多