Spring DAO

Odpowiedz Nowy wątek
2020-03-05 21:16

Rejestracja: 1 rok temu

Ostatnio: 12 godzin temu

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();
    }

}
edytowany 1x, ostatnio: infantylny, 2020-03-05 21:17

Pozostało 580 znaków

2020-03-05 21:32

Rejestracja: 4 lata temu

Ostatnio: 9 minut temu

0

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

Pozostało 580 znaków

2020-03-05 21:37

Rejestracja: 1 rok temu

Ostatnio: 12 godzin temu

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?

Dobra, nie zauważyłem że to twoje DAO to jakiś fejk w pamięci. - MrMadMatt 2020-03-05 21:58

Pozostało 580 znaków

2020-03-05 21:47

Rejestracja: 12 lat temu

Ostatnio: 12 minut temu

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?


Ivory Tower Architect
edytowany 1x, ostatnio: Charles_Ray, 2020-03-05 21:48

Pozostało 580 znaków

2020-03-05 22:16

Rejestracja: 1 rok temu

Ostatnio: 12 godzin temu

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

Pozostało 580 znaków

2020-03-05 22:30

Rejestracja: 12 lat temu

Ostatnio: 12 minut temu

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.


Ivory Tower Architect
Dzięki wielkie za pomoc bo już zgłupiałem xD - infantylny 2020-03-05 22:43
Ło Panie, niezłe oko. Nawet po przeczytaniu Twojej odpowiedzi, zajęło mi kilka minut zanim zauważyłem przyczynę. Nieźle! - kixe52 2020-03-06 10:18

Pozostało 580 znaków

2020-03-05 22:34

Rejestracja: 3 lata temu

Ostatnio: 6 minut temu

Lokalizacja: U krasnoludów - pod górą

2

@Charles_Ray: nieźle!!!

a idź pan


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 1x, ostatnio: jarekr000000, 2020-03-05 22:35

Pozostało 580 znaków

2020-03-06 07:54

Rejestracja: 1 rok temu

Ostatnio: 2 minuty temu

Lokalizacja: Silesia

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


edytowany 3x, ostatnio: Kamil Żabiński, 2020-03-06 07:55
W Javie 1.4 nie było generyków, a trzeba było zachować kompatybilność wstecz - Charles_Ray 2020-03-06 08:06
Ale już dla add​(E e) można było dodać generyka. Można było też dodać nowe metody a te przyjmujące Object oznaczyć jaki deprecated - Kamil Żabiński 2020-03-06 08:16
Niestety nie: 'add(Object)' clashes with 'add(E)'; both methods have same erasure - Charles_Ray 2020-03-06 08:41
Teraz nie za bardzo Cię rozumiem. Wiem że w jednej klasie nie mogą istnieć jednocześnie metody doSomething(Object) i doSomething(E), gdzie E jest generykiem, bo generyki są usuwane na etapie kompilacji. Chodzi mi o to że add ma generyka, a remote nie ma. Obie są tylko w jednej wersji - Kamil Żabiński 2020-03-06 08:49
Spoko, nie zrozumiałem :) rzeczywiście kiedyś było add(Object): https://www2.cs.duke.edu/csed/java/jdk1.4.2/docs/api/ - Charles_Ray 2020-03-06 08:51
trzeba było zachować kompatybilność - wcale nie trzeba, to był wybór. :) Problemem raczej nie jest to, że metoda przyjmuje Object, lecz: 1. metoda do usuwania po indeksie nazywa się tak samo jak ta do usuwania obiektu, 2. istnienie Integer w ogólności. - somekind 2020-03-07 02:02

Pozostało 580 znaków

2020-03-06 08:02

Rejestracja: 7 miesięcy temu

Ostatnio: 12 godzin temu

0

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

BilDodatkoweService().czyNieWybranoCalegoPrzedzialuDlaPsa() - Charles_Ray 2020-03-06 08:45

Pozostało 580 znaków

cs
2020-03-07 19:58
cs

Rejestracja: 1 rok temu

Ostatnio: 7 godzin temu

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ć.

Pozostało 580 znaków

Odpowiedz

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

Robot: Yandex