代码之家  ›  专栏  ›  技术社区  ›  NickJ

春JPA-一对多-重新育儿

  •  4
  • NickJ  · 技术社区  · 6 年前

    我有一些实体在 one-to-many 关系。

    家长:

    @Entity
    @Cacheable(false)
    @Table(name="form_area")
    public class FormArea {
    
      @OneToMany(fetch = FetchType.LAZY, mappedBy="formArea", cascade = { CascadeType.MERGE, CascadeType.PERSIST }) 
      private List<AssignableArea> assignableAreas = new ArrayList<AssignableArea>();
    
      ...
    }
    

    孩子:

    @Entity
    @Cacheable(false)
    @Table(name="assignable_area")
    public class AssignableArea {
      private @ManyToOne FormArea formArea;
      ...
    }
    

    子对象assignablearea在父对象formera上也有getter/setter。

    当我重新当父母使用 setFormArea() ,似乎是成功的,因为数据库包含正确的信息。但当我呼唤 getAssignableAreas() 论福尔马雷亚:

    public List<AssignableArea> getAssignableAreas() {
      return Collections.unmodifiableList(new ArrayList<>(assignableAreas));
    }
    

    我看到旧的清单,在重新做父母之前。 当我期望看到更新的列表时,为什么我会看到旧的、过时的列表?

    1 回复  |  直到 6 年前
        1
  •  1
  •   JB Nizet    6 年前

    最可能的原因是您已经加载了 FormArea 以及它的清单 assignableAreas ,并且您只更新了关联的一方,因此另一方在加载时保持不变:如果关系到您,则维护关联的双方是您的责任。

    如果启动新事务并重新加载窗体区域,则其列表将包含正确的元素。