微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot-JPA-OneToMany首次加载实体参考

如何解决Spring Boot-JPA-OneToMany首次加载实体参考

我与之合作:

  • spring-boot 2.1.3发布
  • JPA
  • MysqL

在我的应用中,我有这个实体:

@Entity
@Access(Accesstype.PROPERTY)
public class CompetenceTemplateEntity extends CompetenceTemplate {

    private CompetenceTemplatePrimaryKey competenceTemplatePrimaryKey;

    @EmbeddedId
    CompetenceTemplatePrimaryKey getCompetenceTemplatePrimaryKey() {
        return competenceTemplatePrimaryKey;
    }

    (...)

    @Override
    @OnetoMany(targetEntity = CompetenceTemplateEntity.class)
    @JoinTable(joinColumns = {
            @JoinColumn(name = "name",referencedColumnName = "name"),@JoinColumn(name = "chapitre",referencedColumnName = "chapitre")},inverseJoinColumns = {
            @JoinColumn(name = "child_name",@JoinColumn(name = "child_chapitre",referencedColumnName = "chapitre")})
    public Set<CompetenceTemplate> getChildren() {
        return super.getChildren();
    }

    @Override
    public void setChildren(Set<CompetenceTemplate> children) {
        super.setChilds(children);
    }

    (...)

    @Embeddable
    public static class CompetenceTemplatePrimaryKey implements Serializable {

        private String name;
        private Chapitre chapitre;

        (...)

    }

}

基类是:

public class CompetenceTemplate {

    protected String name;
    protected Chapitre chapitre;
    protected Categorie categorie;
    protected Set<CompetenceTemplate> children = new HashSet<>();

    (...)

    void addChild(CompetenceTemplate child) {
        AssertUtils.notNull(child,"Une compétence fille ne peut être nulle.");
        AssertUtils.isTrue(categorie == child.categorie,"Une compétence fille doit partager la catégorie de la compétence parente.");
        AssertUtils.isTrue(chapitre == child.chapitre,"Une compétence fille doit partager le chapitre de la compétence parente.");

        children.add(child);
    }

    (...)

}

和基本存储库:

@Repository
public interface CompetenceTemplateRepository extends JpaRepository<CompetenceTemplateEntity,CompetenceTemplateEntity.CompetenceTemplatePrimaryKey> {
}

当我调用存储库的findAll时,由于此行而引发异常:

AssertUtils.isTrue(categorie == child.categorie,"Une compétence fille doit partager la catégorie de la compétence parente.");

导致此异常的实体有子代。当我在调试模式下查看这些子级时,我看到属性类别未加载(但存在于数据库中)。如果我这样修改CompetenceTemplateEntity的方法(为了不调用super方法):

@Override
public void setChildren(Set<CompetenceTemplate> children) {
    this.children = children;
}

我看到在添加对子代的引用之后,缺少的属性已加载。

我尝试了FetchType.Eager,但没有任何改变。

我试图进行单元测试,但由于测试同时加载子项和属性,我变得疯狂。因此,也不例外。...

有人可以告诉我吗?

  • 主要发生什么?
  • 为什么在单元测试期间不会发生这种情况?
  • 如何处理此案?也就是说,使用已设置好的属性加载子项

重要:我无法更改母类CompetenceTemplate!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。