我有一个过程实体,并且一个过程包含卡片实体列表。任何卡都可以在程序之间移动。因此,现在如果我进行移动(实际上是将一张卡的 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
}
Controller
@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();
}
关于java - spring data jpa : after update @many side table, 无法通过同一方法中的 findAll @one side table 获得正确的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746185/