弹簧启动休息一对一 - 开机自检还是放?



我正在开发Spring Boot REST api,现在我遇到了一些logical problem

所以我有一个实体"A",它与实体"B"拥有一对一的关系。 初始,实体"A"被POSTed,没有实体"B"(->,因此关系为空(。

因此,当我想添加实体"B">

时,我应该简单地发布它,还是将实体"A"与实体"B"放在/修补实体"A"?

考虑一个实体的 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> {
}

让我们使用 @postContruct 在 A 实体中保存一些数据

@PostConstruct
void init(){
A a = new A(1,"ABCD");
aRepo.save(a);
}

用于保存 B 实体的控制器:

@PostMapping("/saveB")
public String save(@RequestBody B b){
bRepo.save(b);
return "ok";
}

和用于保存 B 实体的 json:

{ "id":1, "lastName":"xyz", "a":{ "id":1 } }

据我了解,如果我们从 B 存储库中保存实体,我们需要使用 @PostMapping(插入新行(,或者我们可以使用 A 存储库来保存 B 实体,因为这里的映射是双向的,通过使用 @PutMapping(A 数据已经退出数据库,我们需要通过添加 B 的数据来更新它(

使用 ORM 将实体持久化在数据库中之间没有关系,例如HibernatePOST/PUT/PATCHHTTP动词。请不要混淆。

假设您将实体 A 和 B 定义为一对一双向关联(默认情况下,关联(在本例中为一对一(optional属性为 true(:

@Entity
public class A implements Serializable {
private static final long serialVersionUID = -7174277851973636756L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(mappedBy = "a") //If you add optional = false, it will not work
B b;
//And so on
}

@Entity
public class B implements Serializable {
private static final long serialVersionUID = -6581935686158784727L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "id") //You need this, else it will look for "a_id" column(foreign_key) in Class/Table B.
A a;
//And so on
}

和 ARepository 和 BRepository 如下:

public interface ARepository extends CrudRepository<A, Long> {
}
public interface BRepository extends CrudRepository<B, Long> {
}

您可以先执行以下操作:

@Autowired
private ARepository aRepository;
A a = new A();
aRepository.save(a);

后来:

@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

相关内容

  • 没有找到相关文章

最新更新