我有一个过程实体,并且一个过程包含一张卡实体列表。任何卡都可以在过程之间移动。因此,现在如果我进行移动(实际上是将卡的setProcedure移到另一个过程),并立即在下一行找到findAll(),则这两个过程都将返回[]。
尝试在findAll()之前使用saveAndFlush()而不是save(),但也无法正常工作。
实体:
@Entity
@Table(name = "procedures")
public class Procedure {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToMany(mappedBy = "procedure", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonManagedReference
private List<Card> cards = new ArrayList<>();
//...getter setter constructor
}
@Entity
@Table(name = "cards")
public class Card {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
@JsonBackReference
private Procedure procedure;
//...getter setter constructor
}
控制者
@GetMapping("/card/move/{cid}/{nextPid}")
@Transactional
public List<Procedure> moveCard(@PathVariable Long cid, @PathVariable Long nextPid) {
return cardService.moveCard(cid, nextPid);
}
内部服务
List<Procedure> moveCard(Long cid, Long nextPid) {
Card card = cardRepository.findById(cid).get();
Procedure toProcedure = procedureService.findById(nextPid);
card.setIndex(toProcedure.getCards().size());
card.setProcedure(toProcedure);
cardRepository.saveAndFlush(card);
return procedureService.findAll();
}
例如如果在过程1中有1张卡,则在调用此api后,它将返回以下内容:
[
{
"id": 1,
"cards": [],
},
{
"id": 2,
"cards": [],
}
]
但我期望:
[
{
"id": 1,
"cards": [],
},
{
"id": 2,
"cards": [{id: 123}],
}
]
最佳答案
您也必须保持关系的另一面。
您的代码必须如下所示:
List<Procedure> moveCard(Long cid, Long nextPid) {
Card card = cardRepository.findById(cid).get();
// Remove the card from the procedure
card.getProcedure().getCards().remove(card);
Procedure toProcedure = procedureService.findById(nextPid);
// Add it to the new procedure
toProcedure.getCards().add(card);
card.setIndex(toProcedure.getCards().size());
card.setProcedure(toProcedure);
cardRepository.saveAndFlush(card);
return procedureService.findAll();
}