Надеюсь, вы все хорошо проведете время в реальных обстоятельствах. Поскольку я не смог найти ответ на свою проблему, я задаю это как новый вопрос. В настоящее время я работаю над приложением, которое можно использовать для администрирования. Однако, немного экспериментируя, я обнаружил странное поведение. Позвольте мне отметить, что я не буду делать некоторые вещи, которые вы видите в производственном коде. Тем не менее, я хотел бы докопаться до сути и узнать, какие фреймворки я использую еще лучше. Теперь позвольте мне показать вам код:
1. Соответствующая часть лица:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean wareGroupMain;
private String name;
@OneToMany(mappedBy="whg",cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
private Set<Medicine> whgmedicines = new HashSet<Medicine>();
@ManyToOne(cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
@JoinColumn(name="whg_id")
private WHG mainGroup;
@OneToMany(mappedBy="mainGroup", cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
private Set<WHG> subGroups = new HashSet<WHG>();
2. Соответствующая часть репозитория
@Repository
public interface WHGRepository extends JpaRepository<WHG,Long>{
List<WHG> findAll();
3. Соответствующая часть услуги
@Service
public class WHGService {
@Autowired
WHGRepository whgRepository;
public List<WHG> findWHG() {
List<WHG> allWHG = whgRepository.findAll();
List<WHG> result = new ArrayList<WHG>();
Stream<WHG> whgStream = allWHG.stream();
whgStream.forEach((whg) -> {
if (whg.isWareGroupMain()) {
result.add(whg);
}
});
whgStream.close();
return result;
}
public void save(WHG whg) {
whgRepository.save(whg);
}
4. Соответствующая часть компонента
private List<WHG> allwhg;
public void testIinit() {
testInsert();
allwhg=whgService.findWHG();
. , , // Если я пытаюсь получить доступ к whg of allwhg, описанная проблема возникает в любой точке этого класса
. , .
public void testInsert() {
WHG whg = new WHG();
whg.setName("Med1");
whg.setIcon(Icon.MEDKIT);
whg.setWareGroupMain(true);
WHG wug = new WHG();
wug.setName("Med2");
wug.setIcon(Icon.DRINK2);
wug.setWareGroupMain(true);
WHG wag = new WHG();
wag.setName("Med3");
wag.setIcon(Icon.CUBES);
wag.setWareGroupMain(false);
WHG wig = new WHG();
wig.setName("Med4");
wig.setIcon(Icon.BOLT);
wig.setWareGroupMain(false);
wag.setMainGroup(wug);
wig.setMainGroup(wag);
whgService.save(wig);
whgService.save(whg);
whgService.save(wug);
whgService.save(wag);
. , .
Если вам не хватает кода, скажите, пожалуйста, что вам нужно, я с радостью добавлю его. В компоненте происходит то, что я вызываю save (), чтобы вставить себе некоторые тестовые данные, а затем просто «загрузить» их из базы данных. Если позже я вызову whg.getSubgroups () (один из объектов, которые я получу), то он будет нулевым. Это более чем забавно, так как 1) должно иметь контент, 2) я думаю, что я помню, что hibernate может вернуть пустую коллекцию, но не ноль ...
Итак, вопрос в том, почему whg.getSubgroups()
ноль, когда Вы вызываете save (), а затем находитеAll ()? Кроме того, если вы повторите описанный выше метод вставки, первые три объекта теперь будут корректно извлечены (те, с которыми у нас ранее была нулевая проблема). Однако, теперь вновь сохраненные и извлеченные объекты имеют нулевую проблему. Это повторяется до бесконечности (все еще правильно сохраняется в жесткой базе данных).
Я надеюсь, что смогу прояснить мою проблему, если нет, скажите, пожалуйста, так. Я потратил так много времени на что-то, что могло бы быть действительно тривиальным, но я не получаю это, и я не мог найти место в inte rnet, где был бы дан ответ на мой вопрос.
Я действительно жду вашего ответа Полезный ответ!
С наилучшими пожеланиями, foAW