代码之家  ›  专栏  ›  技术社区  ›  buræquete Naveen Kocherla

如果没有父存储库中的显式刷新,则不会持久化对父存储库的修改

  •  0
  • buræquete Naveen Kocherla  · 技术社区  · 6 年前

    spring-data-jpa 2.0.8.RELEASE

    @OneToMany 相关实体对。比如说 King & Peasant . 我想有一个逻辑,当一个农民被更新时,这也会更新国王 @LastModifiedDate 手动设置值。我做这种事;

    @PreUpdate
    @PreRemove
    @PrePersist
    void updateParents() {
        Date now = new Date();
        BaseEntity container = getParent();
        while (Objects.nonNull(container)) {
            container.setUpdateDateTime(now);
            container = container.getParent();
        }
    }
    

    这很好,这意味着它确实更新了所有的父级到国王(表结构非常混乱,从国王到最底层的农奴有5个深度),问题是,对父级的修改根本没有持久化。我有如下服务:;

    @Transactional
    public void update(String kingId, String peasantSeqNo) {
        Peasant peasant = peasantRepository.getPeasant(kingId, peasantSeqNo);
        peasant.setNobility(false);
        peasantRepository.save(peasant);
    }
    

    @PreUpdate 注释 updateParents() 方法,并更新king的更新时间戳,仍然在事务结束后,此更改不会持久化。我可以用一个显式的 kingRepository.flush()

    王农之间的联系是这样的;

    @JsonManagedReference
    @OneToMany(mappedBy = "parent", cascade = REMOVE)
    private List<Peasant> peasantry;
    

    @JsonBackReference
    @MapsId("kingId")
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "ID_KING", referencedColumnName = "ID_KING", nullable = false)
    private King parent;
    

    这在某种程度上是我使用JPA的一个问题,但是找不到确切的原因和解决方案,你能给我一些建议吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jens Schauder    6 年前

    您遇到了JPA(实现)的限制。

    这个行为实际上被定义为JPA规范中没有定义:

    [46]请注意,此警告也适用于可能注入实体侦听器的对象的操作。

    [47]此类操作的语义可在本规范的未来版本中标准化。