Spring 弹簧靴支架是一对一柱还是放?
我正在开发SpringBootRESTAPI,现在我遇到了一些逻辑问题 所以我有一个实体“A”,它与实体“B”有一对一的关系。 最初,实体“A”与实体“B”一起过帐(>因此关系为空)Spring 弹簧靴支架是一对一柱还是放?,spring,spring-boot,hibernate,rest,spring-rest,Spring,Spring Boot,Hibernate,Rest,Spring Rest,我正在开发SpringBootRESTAPI,现在我遇到了一些逻辑问题 所以我有一个实体“A”,它与实体“B”有一对一的关系。 最初,实体“A”与实体“B”一起过帐(>因此关系为空) 因此,当我想添加实体“B”时,我应该简单地发布它,还是用实体“B”放置/修补实体“A”?使用ORM(如Hibernate和POST/PUT/PATCH)将实体持久化到数据库中,这两者之间没有关系,后者是HTTP动词。请不要弄糊涂了 假设将实体A和B定义为一对一的双向关联(默认情况下,关联的(在本例中为一对一)opt
因此,当我想添加实体“B”时,我应该简单地发布它,还是用实体“B”放置/修补实体“A”?使用ORM(如
Hibernate
和POST/PUT/PATCH
)将实体持久化到数据库中,这两者之间没有关系,后者是HTTP
动词。请不要弄糊涂了
假设将实体A和B定义为一对一的双向关联(默认情况下,关联的(在本例中为一对一)optional
属性为true):
以及如下所示的假设和假设:
public interface ARepository extends CrudRepository<A, Long> {
}
public interface BRepository extends CrudRepository<B, Long> {
}
后来:
@Autowired
private BRepository bRepository;
B b = new B();
bRepository.save(b);
等效的SQL:
insert
into
a
(id)
values
(?)
insert
into
b
(id)
values
(?)
注:
如果实体已经存在,
save
将执行update
而不是insert
,但由于我们使用的是自动生成的id,因此它将始终执行insert
考虑实体的A和B,并使用firstName和lastName字段:
@Entity
public class A {
@Id
private Integer id;
private String firstName;
@OneToOne(mappedBy = "a")
private B b;
}
@Entity
public class B {
@Id
private Integer id;
private String lastName;
@OneToOne
private A a;
}
存储库包括:
@Repository
public interface ARepo extends JpaRepository<A,Integer> {
}
@Repository
public interface BRepo extends JpaRepository<B,Integer> {
}
保存B实体的控制器:
@PostMapping("/saveB")
public String save(@RequestBody B b){
bRepo.save(b);
return "ok";
}
和用于保存B实体的json:
@PostMapping("/saveB")
public String save(@RequestBody B b){
bRepo.save(b);
return "ok";
}
{
“id”:1,
“姓氏”:“xyz”,
“a”:{
“id”:1
}
}
根据我的理解,如果我们从B存储库保存实体,我们需要使用@PostMapping(插入新行),或者我们可以使用a存储库来保存B实体,因为这里的映射是双向的,通过使用@PutMapping(数据库中已经存在一个数据,我们需要通过添加B的数据来更新它)
@PostConstruct
void init(){
A a = new A(1,"ABCD");
aRepo.save(a);
}
@PostMapping("/saveB")
public String save(@RequestBody B b){
bRepo.save(b);
return "ok";
}