Spring DAO

0

Mam klasę Kot oraz repozytorium KotDAO, w którym znajduje się lista obiektów typu Kot. Dlaczego w klasie Controller metoda firstDeleteKot nie działa a SecondDeletKot działa? W obu przypadkach pracujemy przecież na tej samej referencji. Czy wpływ na to mają użyte adnotacje? Dla standardowej aplikacji, w której klasa Kot oraz KotDAO( bez @Repository) są identyczne jak te pokazane niżej, dla obiektów dodanych do listy bezpośrednio w kodzie programu oba sposoby usuwania działają poprawnie.

public class Kot {

   private String imie;
   private String imieOpiekuna;
//Gettery i Settery
}
@Repository
public class KotDAO {
    List<Kot> koty = new ArrayList<>();

    public void dodajKota(Kot kot) {
        koty.add(kot);
    }

    public void usunKota(int index){
        koty.remove(index);
    }

    public List<Kot> getKoty() {
        return koty;
    }

}
@RestController
public class Controller {

    @Autowired
    KotDAO kotDAO;

    @PostMapping("/koty")
    public void addKota(@RequestBody Kot kot){
        kotDAO.dodajKota(kot);
    }

    @GetMapping("/koty")
    public List<Kot> getKoty(){
        return kotDAO.getKoty();
    }

    @DeleteMapping("/koty/first/{id}")
    public List<Kot> firstDeleteKot(@PathVariable("id") Integer id){
        kotDAO.getKoty().remove(id);
        return kotDAO.getKoty();
    }

    @DeleteMapping("/koty/second/{id}")
    public List<Kot> SecondDeleteKot(@PathVariable("id") Integer id){
        kotDAO.usunKota(id);
        return kotDAO.getKoty();
    }

}
0

kotDAO.getKoty().remove(id); Tu usuwasz obiekt z pobranej listy getKoty() a nie z bazy. Operujesz na kolekcji, nie na bazie / DAO.

0
MrMadMatt napisał(a):

kotDAO.getKoty().remove(id); Tu usuwasz obiekt z pobranej listy getKoty() a nie z bazy. Operujesz na kolekcji, nie na bazie / DAO.

Referencja na listę jest ta sama. DAO korzysta z tej samej listy, więc dlaczego nie widzi zmian w przypadku usunięcia za pomocą kotDAO.getKoty().remove(id); przecież zmieniany jest obiekt na którym operuje ta klasa?

2

Oba sposoby są równoważne, operujesz na tej samej instancji listy. Masz jednak świadomość, że usuwasz element po indeksie, a nie po id?

Btw. Debugowałeś to?

0
Charles_Ray napisał(a):

Oba sposoby są równoważne, operujesz na tej samej instancji listy. Masz jednak świadomość, że usuwasz element po indeksie, a nie po id?

Btw. Debugowałeś to?

screenshot-20200305221456.png

Dalej nie rozumiem czemu te metody nie działają jednakowo

9

O fak już wiem xD w jednym przypadku usuwasz po indeksie (mały int), a w drugim obiekt (Integer), który nie jest znajdowany w liście. Zobacz, że nawet IntelliJ podświetla Ci to na żółto. Niestety w Javie List#remove przyjmuje Object.

2

@Charles_Ray: nieźle!!!

a idź pan

2
Charles_Ray napisał(a):

Niestety w Javie List#remove przyjmuje Object.

Dla potomnych:
Niestety wszystkie kolekcje dziedziczące po Collection są zepsute metodą remove(java.lang.Object). Nie wiem co palili twórcy Javy przy wprowadzaniu generyków że zostawili metody remove i contains przyjmujące Object zamiast generyka. Naciąłem się na tym dla Set. Ale dla List jest jeszcze większa magia, bo mamy dwa remove:

  • remove(java.lang.Object) - odziedziczony z Collection usuwający po wartości elementu
  • remove(int) - dodany w List usuwający po indeksie elementu

Niezłe heheszki z tych twórców Javy

0

Do pełni szczęścia brakuje tylko flagi isPies, tfu... isKot do sprawdzenia przed deleteKot.

0
Kamil Żabiński napisał(a):
Charles_Ray napisał(a):

Niestety w Javie List#remove przyjmuje Object.

Dla potomnych:
Niestety wszystkie kolekcje dziedziczące po Collection są zepsute metodą remove(java.lang.Object). Nie wiem co palili twórcy Javy przy wprowadzaniu generyków że zostawili metody remove i contains przyjmujące Object zamiast generyka. Naciąłem się na tym dla Set. Ale dla List jest jeszcze większa magia, bo mamy dwa remove:

  • remove(java.lang.Object) - odziedziczony z Collection usuwający po wartości elementu
  • remove(int) - dodany w List usuwający po indeksie elementu

Niezłe heheszki z tych twórców Javy

Raczej to nie heheszki, ani ziołoterapia, a konsekwencja w łączeniu starego z nowym.

        List list = new ArrayList<>();
        list.add("ALIBABA");
        list.add(new Object());
        list.add(10);
        list.add('a');

        List<String> strings = list;
        strings.remove((Integer) 10);
        strings.remove((Character)'a');

a nawet, gdyby remove i contains były generyczne to List<Integer> czy List<Character> też może namieszać.

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