Dublowanie obiektów w liście.

0

Dodawnie do listy:

 newProject.getUsers().add(user);
    List<User> users = project.getUsers();
        for(User u : users){
            System.out.println(u.getName());
        }

Wypisuje dwa razy to samo.
W bazie wygląda dobrze: Projekt o id 3, ma jednego użytkownika o id 2, więc dlaczego to List<User> users = project.getUsers(); daje dwa obiekty?
baza.PNG

da.PNG

0

Z taką ilością kodu to my nic nie poradzimy.

0

Ok dorzucę więcej:

     @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String getAddNewProjectForm(Map<String, Object> modelMap) {
        Map<String, String> statuses = projectService.statuses();

        Project newProject = new Project();
        modelMap.put("newProject", newProject);
        modelMap.put("statuses", statuses);
        return "addProject";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddNewProjectForm(@ModelAttribute("newProject") Project
                                                   newProject, BindingResult result) {
        User user = userService.getUserFromContext();
        newProject.getUsers().add(user);
        newProject.setEmailOfCreator(user.getEmail());
        newProject.setVisible(true);


        String[] suppressedFields = result.getSuppressedFields();
        if (suppressedFields.length > 0) {
            throw new RuntimeException("Próba wiązania niedozwolonych pól: " + StringUtils.arrayToCommaDelimitedString(suppressedFields));
        }
        projectService.save(newProject);
//        return "redirect:add?success=true";
        return "redirect:your";

    }

    @RequestMapping("/project")
    public String getYourProjects(@RequestParam("id") Long id, Map<String, Object> modelMap) {

        Project project = projectService.findById(id);
        System.out.println("Id:" + project.getId());
        modelMap.put("projectDetails", project);
        List<Task> taksInProject = projectService.findTasksByProject(project);

        List<User> users = project.getUsers();
        for(User u : users){
            System.out.println(u.getName());
        }

        modelMap.put("tasksInProject", taksInProject);
        Invitation invitation = new Invitation();
        modelMap.put("newInvitation", invitation);
        return "projectDetails";
    }
2

Strzelam, Jak masz relacje @OneToMany i pobierasz dane z tabel to w pewnych sytuacjach robisz cos w stylu "iloczyn kartezjusza". Przykladowo mamy 3 tabele ktore sa w relacji ze soba. w tabeli A mamy jeden interesujacy nas rekord ktory jest polaczony z jakimis w B a ten z kolei z jakimis w C. I teraz jak Hibernate generuje zapytanie(mozesz pokazac sql) to przy EAGER Pobierajac B pobierasz i C. w ten sposob mimo where a.id = ? to jezeli B ma ze 2 rekordy odpowiadajace w C to mozesz otrzymac wlasnie taki wynik. Mysle, ze bardziej nam sie przyda kod z modelu(@Entity).
Prawdopodobnie wystarczy podac @Fetch(type=SELECT).

1 użytkowników online, w tym zalogowanych: 0, gości: 1