首先,我使用 Spring MVC 。
我有一个“Skill”-modelclass,我放置了@JsonIgnoreProperties
@JsonIgnoreProperties({"personSkills","berufsgruppes","skills"})
@JsonPropertyOrder({"idSkill", "name", "levelBezeichnung", "skill"})
我正在使用它,因为存在多对多或多对一或一对多关系,并且没有此属性会导致StackOverFlowException(无限错误)。一项技能可以有很多技能,所以有一种递归。
我为名为“SkillBean”的“技能”实现了一个子类,它还有一个“已检查”的属性,它与应用程序的相关性不属于数据库。
public class Skill implements java.io.Serializable {
private Set<Skill> skills = new HashSet<Skill>(0);
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "skill")
public Set<Skill> getSkills() {
return this.skills;
}
public void setSkills(Set<Skill> skills) {
this.skills = skills;
}
public class SkillBean extends Skill implements Serializable{
public boolean checked;
public SkillBean() {
}
public SkillBean(Skill skill, boolean checked) {
this.checked = checked;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
使用 BeanUtils.copyProperties()将Skill-Object复制到SkillBean-Object中。这很好用。我需要对技能进行重新排序,因为目前我的儿童技能最低,而不是父母。为此,我试图重新排序对象并尝试在列表中构建一个树。每个技能都有一套孩子。
private ArrayList<SkillBean> formatSkillMap(HashMap<Integer, SkillBean> map) {
Map<Integer, SkillBean> tempSkills = (Map<Integer, SkillBean>) map.entrySet().stream().filter(p -> p.getValue().getSkill() == null)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
ArrayList<SkillBean> list = new ArrayList<SkillBean>(tempSkills.values());
for (int i = 0; i < list.size(); i++) {
SkillBean sb = list.get(i);
tempSkills = (Map<Integer, SkillBean>) map.entrySet().stream().filter(p -> p.getValue().getSkill() != null)
.filter(p -> p.getValue().getSkill().getIdSkill() == sb.getIdSkill()).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Set<Skill> test = new HashSet<Skill>(tempSkills.values());
list.get(i).setSkills(test);
}
return list;
但是列表没有返回子技能组有人能告诉我为什么子技能没有被序列化吗?当我返回这个父技能的子集时,它们的子技能被序列化。
0: {
"idSkill": 34
"name": "Methodik"
"levelBezeichnung": {
"@id": 1
"idLevelBezeichnung": 1
"bezeichnung": "Standard"
"handler": {}
"hibernateLazyInitializer": {}
}-
"checked": true
}
没有重新排序它看起来像这样,但问题是id = 34的技能是父技能,9是单项技能。我完全想要它反过来。可能有三个级别。
9: {
"idSkill": 9
"name": "Standards"
"levelBezeichnung": {
"@id": 1
"idLevelBezeichnung": 1
"bezeichnung": "Standard"
"handler": {}
"hibernateLazyInitializer": {}
}-
"skill": {
"idSkill": 34
"name": "Methodik"
"levelBezeichnung": 1
}-
"checked": true
}
答案 0 :(得分:0)
最后,我最终得到了这个:
忽略技能的父级或忽略技能的子级以避免无限递归。 在某些情况下,您不需要忽略其中一个。如果您没有那么多数据,它可以工作。我正在谈论每个节点都知道其父/子的150个节点。
我通过自定义SQL查询查询自己最低技能的自下而上的路径。
我将所有技能都放在地图的最高级别。这意味着,我可以访问我的所有技能,因为(正如我所说的)每个节点都知道他的孩子。
我在我的地图上从上到下进行搜索,并根据我已经获得的路径删除了我不需要的所有参考文献。
整个代码有点复杂,我使用递归使其不那么复杂。最后我对这个解决方案并不满意,因为它中有很多循环,到目前为止我遇到了性能问题。
我需要发现它是数据库查询问题还是循环引起的问题。