Это предположение, но я подозреваю, что Node.setChildren () вызывается до того, как дочерние объекты фактически заполнятся данными из вспомогательного SQL-запроса Hibernate. Hibernate иногда создает объекты только с установленным значением @Id; если вы читаете документацию о ленивых прокси, вы должны увидеть доказательства этого. Я подозреваю, что Hibernate создал дочерние объекты Node, но еще не заполнил их данными, потому что он должен сначала заполнить родительский Node. В основном ваш сеттер слишком рано стреляет.
Вы можете проверить это, отладив код и добавив точку останова в setChildren () и setName (). Вы не показываете метод setName () в приведенном выше коде, но я предполагаю, что вы просто его опустили. Также проверьте стек в точке останова, чтобы понять, что делает Hibernate во время вызова вашего установщика.
Один обходной путь - добавить логику из setChildren () в getChildren () следующим образом:
@Transient public Set<String> getChildrenNames() {
if (children.size() != childrenNames.size() {
childrenNames.removeAll();
for(Node child : children) {
childrenNames.add(child.getName());
}
}
return childrenNames;
}
Это может выполняться только один раз, и к тому времени, когда вызывается метод получения, должны быть заполнены данные в дочерних элементах. Или вы можете поместить логику, которая заполняет "childrenNames", в метод, отличный от getter / setter, и вызывать его вручную после запроса.