findAll () сразу после save () возвращает ноль для всех коллекций OneToMany - PullRequest
0 голосов
/ 29 апреля 2020

Надеюсь, вы все хорошо проведете время в реальных обстоятельствах. Поскольку я не смог найти ответ на свою проблему, я задаю это как новый вопрос. В настоящее время я работаю над приложением, которое можно использовать для администрирования. Однако, немного экспериментируя, я обнаружил странное поведение. Позвольте мне отметить, что я не буду делать некоторые вещи, которые вы видите в производственном коде. Тем не менее, я хотел бы докопаться до сути и узнать, какие фреймворки я использую еще лучше. Теперь позвольте мне показать вам код:

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

...