[英]API Rest with Spring Boot
我正在看一些关于 API Rest with Spring Boot 的视频,到目前为止我已经完成了一些基础知识,当我试图增加复杂性时,我被抓住了。
我的想法是在 Post / class 中,创建一个新类,让学生获得以下 json:
{
"nome": "Primeira Serie - A".
"alunos": [
"João",
"José",
"Maria"
]
}
并返回:
{
"id_classe": 101
}
碰巧它保存了班级,但它没有保存学生,我不知道如何只显示班级的 id。
我在 Java 中创建了以下类:
模型
类.java
package com.example.classe.model;
//Import's suppressed
@Entity
@Table(name = "classe")
public class Classe {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String nome;
@OneToMany(mappedBy = "classe")
private Set<Aluno> alunos = new HashSet<Aluno>();
//Get's e Set's suppressed
}
阿鲁诺.java
package com.example.classe.model;
//Import's suppressed
@Entity
@Table(name = "aluno")
public class Aluno {
private static int tempID = 0;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String nome;
@ManyToOne
@JoinColumn(name = "id_classe")
@JsonBackReference
private Classe classe;
public Aluno(String nome) {
tempID++;
this.id = tempID;
this.nome = nome;
}
public Aluno() {
}
//Get's e Set's suppressed
}
存储库
类Repository.java
package com.example.classe.repository;
//Import's suppressed
@Repository
public interface ClasseRepository extends JpaRepository<Classe, Integer> {
public List<Classe> findAll();
}
控制器
类控制器.java
package com.example.classe.controller;
//Import's suppressed
@RestController
@RequestMapping("/classe")
public class ClasseController {
@Autowired
private ClasseRepository classeRepo;
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<Collection<Classe>> getClasse() {
return new ResponseEntity<>(classeRepo.findAll(), HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> salvarClasse(@RequestBody Classe classe) {
return new ResponseEntity<>(classeRepo.saveAndFlush(classe), HttpStatus.CREATED);
}
}
我做错了一切还是我不理解这个概念? 但我想了解如何做到这一点。
提前致谢。
塞萨尔·斯图里昂
您想要实现的目标是完全可行的,但需要进行一些更改。 我把我的答案分成两部分:
保存有几个问题:
在 POST 时,传入的 json 反序列化为Classe
引用Anuli
,但Anuli
没有引用Classe
。 要检查它,您可以在该行添加一个断点: return new ResponseEntity<>(...
,在调试模式下运行并检查Classe
中Anuli
字段。要修复它,您可以在Classe
aluni 字段上添加@JsonManagedReference
。 相关题
默认情况下,Hibernate 无法保存引用的对象。 您必须在保存 Classe 对象后一一保存它们,或者只需打开 Cascade 持久化。 相关问题
因此,要修复 1 和 2 Classe
应该具有:
@OneToMany(mappedBy = "classe", cascade = CascadeType.PERSIST)
@JsonManagedReference
private Set<Aluno> alunos = new HashSet<Aluno>();
static int tempID
)。 只要你持久化一个对象,注释@GeneratedValue
就会完美地为你生成 id。 此自定义生成破坏了 Hibernate 支持。 我什至没有谈论它在重启后也会破坏应用程序,而不是线程安全等。 在 POST 返回的 json 表示在classeRepo.saveAndFlush(classe)
返回的内容,因此它是Classe
的对象。
如果你想完全返回这个:
{
"id_classe": 101
}
然后像这样创建新类:
public class ClasseIdVO {
@JsonProperty("id_casse")
private Integer id;
// Constructors, getter, setter
VO - 表示视图对象,所以这个对象只用于表示,不用于持久化等。
您可以使用字段名称id_casse
,但它违反 Java 代码约定,因此最好添加@JsonProperty
。
new ClasseIdVO(classeRepo.saveAndFlush(classe).getId())
您的保存代码更改为new ClasseIdVO(classeRepo.saveAndFlush(classe).getId())
或者您可以将 id 作为数字返回: classeRepo.saveAndFlush(classe).getId()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.