【问题标题】:Spring Post method with relational database (RestApi)Spring Post 方法与关系数据库(Rest Api)
【发布时间】:2019-04-25 07:29:35
【问题描述】:

我有一个问题,我不知道如何在 Hibernate 中创建关系数据库以及如何创建 json i post 方法。

我想通过现有老师与新学生联系,我想找到所有有特定老师的学生。我想在学生表中为教师创建外键。

我的代码:

基础实体

@MappedSuperclass
@Data
public class BaseEntity {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

}

学生

@Entity
@Table(name = "student")
public class Student extends BaseEntity{

    @Column(name = "name")
    private String name;

    @ManyToOne
    private Teacher teacher;
...
}

老师

@Entity
@Table(name = "teacher")
public class Teacher extends BaseEntity{

    @Column(name = "name")
    private String name;
...
}

教师控制器

 @RequestMapping(value = "/add", method = RequestMethod.POST)
    public void addTeacher(@RequestBody Teacher teacher) {
        teacherService.addTeacher(teacher);
    }

学生控制器

 @RequestMapping(value = "/add", method = RequestMethod.POST)
    public void addStudent(@RequestBody Student student) {
        studentService.addStudent(student);
    }

我创建老师时的 JSon 身体:

{
    "name" : "Test"
}

学生发帖方法应该是这样的吗?

{
        "name": "TestStudent",
        "teacher": {
            "id": 1,
            "description": "Test"
        }
}

【问题讨论】:

  • 首先,您需要在 addStudent 方法中将 Student 和 student 分开。
  • @OcelotcR 完成 :)

标签: java spring hibernate rest many-to-one


【解决方案1】:

@kubek,如果这是您的网络应用程序,并且您是从 UI(视图)端执行此操作,那么您可以放置​​教师列表的组合框,然后在选择该教师时,您可以将其 id 传递到如下表格中: { "name": "TestStudent", “老师”: { “身份证”:1 } }

这将自动找到教师对象(id)并将其保存到数据库中。

【讨论】:

  • 当我发帖时:{ "name": "TestStudent", "teacher": { "id": 1 } } 我有错误:{ "timestamp": "2019-04-26T05: 25:56.008+0000", "status": 400, "error": "Bad Request", "message": "无法将 'java.lang.String' 类型的值转换为所需的 'long' 类型;嵌套异常是java.lang.NumberFormatException: 对于输入字符串:\"add\"", "path": "/student/add" }
  • @Kubek,您是否在 Controller 中添加了断点以检查您在 Controller 端获得的值?如果不是,请先检查数据类型!仍然出现错误,请分享堆栈跟踪和代码。
  • 我有发布方法:@RequestMapping(name = "/add", method = RequestMethod.POST) public void addStudent(@RequestBody Student student){ studentService.addStudent(student);} 我应该改变吗某事,因为我在 RequestBody 中有对象(实体)学生。
  • @Kubek,我有另一个解决方案。这是我的代码,对我来说很好用。 @PostMapping(value = "/event/add", consumes = { "application/json" }) public ResponseEntity addEvent(@RequestBody(required = false) EventDto eventdto)
  • 第二件事:如果可能的话,尝试在你的控制器中使用 DTO 对象(检索和查看目的的临时 POJO)而不是主 POJO。这样最终用户就无法查看你的整个 POJO 并且还有一层的抽象。如果您使用的是 DTO 对象,那么 {"name": "TestStudent", "teacher_id": 1 } 将是您对控制器的输入。让我知道它是否有效。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2016-05-18
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2020-12-05
相关资源
最近更新 更多