java - spring data jpa : after update @many side table, 无法通过同一方法中的 findAll @one side table 获得正确的更改

标签 java hibernate spring-boot spring-data-jpa

我有一个过程实体,并且一个过程包含卡片实体列表。任何卡都可以在程序之间移动。因此,现在如果我进行移动(实际上是将一张卡的 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/

相关文章:

java - 从特定位置获取视频缩略图 - Android

java - 用于生成唯一 ID 的哈希算法?

java - 如何为连接池配置 Hibernate、Spring 和 Apache dbcp?

java - 传递给 Paint() 调用的顶级组件是什么?

java - 在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常

java - 在 Spring/Java 中过滤特殊字符

sql - 是否可以在 Hibernate 中使用分析函数?

java - Spring Security 获取自定义 header

java - 如何使用 Spring Boot/javax.net.ssl.SSLHandshakeException : Received fatal alert: handshake_failure 使用自定义证书进行 HTTP GET

java - Spring Batch ItemReader + RabbitMQ - 未指定 'queue'