如何解决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 举报,一经查实,本站将立刻删除。