Używam strategii pojedynczej tabeli do utrwalania danych, moja (przykładowa) struktura wygląda następująco:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Musician {

    @Id
    private Integer id;

    private String name;

    // getters, setters
}

Z podklasami jako takimi:

@Entity
public class MusicianGuitar extends Musician {
}

@Entity
public class MusicianVocals extends Musician {
}

Każda podklasa ma również swoją własną klasę repozytorium, która wygląda tak:

public interface MusicianGuitarRepository extends JpaRepository<MusicianGuitar, Integer> {
}

public interface MusicianVocalRepository extends JpaRepository<MusicianVocal, Integer> {
}

Czytam ich kolekcję ze źródła, ale chcę napisać metodę zapisu, aby była ponownie użyta. Oto, co obecnie mam:

private void saveGuitarists(List<MusicianGuitar> guitarists) {
    for (MusicianGuitar guitarist : guitarists) {
        MusicianGuitar existingGuitarist = guitaristRepository.findByName(guitarist.getName());
        if (existingGuitarist == null) {
            MusicianGuitar newGuitarist = new MusicianGuitar();
            newGuitarist.setName("Slash");
            guitaristRepository.save(newGuitarist);
        }
    }
}

.. i podobnie dla saveVocalists, saveDrummers, itp

Problem polega na tym, że muszę napisać tego rodzaju metodę dla każdego typu muzyków, których obecnie mam, i będę musiał napisać ją ponownie, jeśli zostaną dodane później nowe typy - w tym przykładzie i moim praktycznym obiekty mają te same pola , są po prostu różnych typów. Rozważałem przekazanie typu wyliczenia Musician, ale to nie czyni rzeczy prostszymi. Podejrzewam, że istnieje sposób, w jaki mogę wykorzystać mapowanie dziedziczenia, ale nie widzę, jak… z góry dziękuję!

1
Clint 19 grudzień 2019, 23:59

1 odpowiedź

Możesz spróbować użyć czegoś takiego

private void saveGuitarists(List<? extends Musician> musicians) {
   for (Musician musician : musicians) {
        Musician existingMusician = musicianRepository.findByName(musician.getName());
        if (existingMusician == null) {
            // create Musician and populate fields
            musicianRepository.save(newMusician);
        }
    }
}
0
SternK 20 grudzień 2019, 01:12
Repozytorium nie wiedziałoby jednak, jaki typ załadować lub zachować.. może użyć instanceof do wykrycia go z listy, ale nadal mam podobną sytuację do tego, co miałem i musiałbym tworzyć obiekty i wywoływać różne repozytoria w zależności od na typie.
 – 
Clint
20 grudzień 2019, 01:31
Gdzie teraz umieszczasz swoją metodę saveGuitarists?
 – 
SternK
20 grudzień 2019, 10:44