Я надеюсь, что смогу прояснить ситуацию и разобраться в сути проблемы. Поэтому у меня есть приложение, в котором я использую Spring-boot и hibernate. Я использую JPA-репозиторий интерфейсов для DAO. У меня есть объект с именем NameSection, который содержится в 7 различных объектах. NameSection имеет 3 списка различных именных объектов (латинское имя, общее имя, шведское имя). Когда я вызываю мой сервис. GetNameSection (30);например, я получаю разные результаты в зависимости от того, где я это называю. Если я вызываю его из моего контроллера, где у меня есть неполная копия раздела имен, он, похоже, не хочет делать запрос к моей базе данных, даже если я вызываю мой сервис и getNameSection (nameSectionId);(который, в свою очередь, вызывает мои JPA-репозитории).
Возможно ли, что загрузка Spring или Hibernate остановит запрос к моей базе данных, потому что он имеет, как он считает, полный NameSection в своей памяти?
Метод, с которым я борюсь, вызывается, когда я в форме отправляю объект (скажем, Plant-object) и хочу перейти к связанной форме NameSection.
Когда я отправляю форму Plant, я получаю инъекцию растения моему методу в качестве модельного атрибута. В этом методе я получаю NameSection-id и вызываю service.getNameSection (nameSectionId);и это не дает мне полный раздел названия. В форме установки я ссылаюсь на раздел имен, поэтому в моем списке CommonName (в NameSection) у меня есть один загруженный CommonName. Но есть еще кое-что для сбора, поэтому я и вызываю свой сервис.
Я как бы сводил это к следующему: если я отправляю Plant-форму, которая содержит NameSection.id = 30, и я вызываю service.getNameSection (30);Я получу nameSection только с одним CommonName.
Если я отправлю другую Plant-форму, которая содержит другой NameSection, но я жестко закодировал service.getNameSection (30);и, в любом случае, зарегистрировав его, как тест, я получаю полный NameSection (30) и полностью загруженный список.
Что еще более неприятно, так это то, что NameSection работает так, как я хочу, для объекта типа Fish, который также содержитNameSection. Оба метода используют один и тот же поток. В методе, приведенном ниже, просто замените каждое «растение» на «рыбу», и это то же самое.
Я подозреваю, что весна или спящий режим или что-то требует сокращения. Я пытался обнулить Plant и NameSection перед вызовом service.getNameSection (id);также, но он не будет загружать полный nameSection, если у меня уже есть неполная копия, даже если она обнуляется. По крайней мере, так мне кажется. Я застрял на несколько дней.
Вызов service.getPlant (plantId);также загрузит полный NameSection, но это не работает ни в этом конкретном методе. Работает нормально в моем методе editPlant, например, в том же классе контроллера.
Итак, это метод:
// Process Plant form
@RequestMapping("/processPlantForm")
public String savePlantForm(Model model,
@RequestParam("saveButt") String saveButt,
// plant holds an incomplete namesection at this point
@Valid @ModelAttribute("plant") Plant plant,
BindingResult theBindingResult){
...snipped validation...
plantService.savePlant(plant);
if (saveButt.equals("Edit NameSection")) {
// Here is the problem section!!
NameSection nameSec =
plantService.getNameSection(plant.getNameSection().getId());
System.out.println("common names size: " + nameSec.getCommonNames().size());
// Hardcoded test phrase
NameSection secNameSec = plantService.getNameSection(30);
System.out.println("common names size: " + secNameSec.getCommonNames().size());
model.addAttribute("plant", plant);
model.addAttribute("nameSectionForm", new NameSectionForm(nameSec));
model.addAttribute("inflateNameSection", true);
return "form/create-plant";
}
else {
return "redirect:/listPlant";
}
}
Итак, перейдем к этому методу с растением, которое содержитNameSection с идентификатором 30 в обоих случаях «getNameSection ( id )» - вызывает загрузку NameSection (id = 30) только с одним CommonName (которое соответствует неполному NameSection из modelAttribute).
Переходя к этому методу с любым другим заводом, который НЕ содержит NameSection (id = 30), он загрузит полный NameSection (id = 30) со всеми связанными CommonNames в моей «Жестко закодированной тестовой фразе».
В обоих случаях я получу все шведские имена и все латинские имена, связанные с NameSection, вероятно потому, что они оба являются пустыми списками в неполном NameSection из ModelAttribute.
Итак, я ожидал, что plantService.getNameSection(nameSectionId);всегда давать один и тот же результат для одного и того же nameSectionId ofc. Но кажется, что какой-то «умный ярлык» заставляет его пропустить несколько шагов, если кусочки доступны в памяти, и что в этом случае он делает ложные предположения, или это только я?
Возможно, я мог бы создать специальный запрос для запроса отсутствующих CommonNames, но должен быть более аккуратный способ. И что меня убивает, так это то, что он работает 1 из 7 различных объектов, которые содержат раздел имен. Конечно, между ними должно быть какое-то различие, но я просто не могу его найти. Единственным различием, которое я обнаружил, было то, что у меня изначально была «Модель модели» после «BindingResult theBindingResult» при внедрении метода. Я переместил это, чтобы соответствовать рабочему методу для рыб, но это не делало никакого различия.
Я также попытался добавить вызов getCommonNames (). Size () в мой метод service.getNameSection (id) для "сбора Lazy-списка", но он не сделал различий.
AnyPro, кто получил представление о том, что случилось?