JDBCTemplate - zapis danych do dwóch tabel

0

Cześć,

Szukam dobrego sposobu na zapis danych z jednego formularza do dwóch tabel. Relacja jeden do wielu.
Mam 2 tabele na razie pomijam fakt zastosowania listy lub mapy. W skrócie:

Employee
id_employee

Address
id_address
id_employee

Pobranie danych z formularza, stworzenie obiektów Employee i Address.
Nie mam id_employee dopóki nie zapiszę pracownika w bazie danych (tam nadaję ID triggerem używając stworzonej sekwencji).
Muszę więc

  1. zapisać pracownika do bazy danych,
  2. pobrać z bazy danych jego ID,
  3. ustawić to id w obiekcie address
  4. zapisać address do bazy.

I tu pojawia się problem jak to zrobić. Przykład który udało mi się znaleźć wygląda tak:

String sql = "insert into role(name, code) values(?,?);" +
    "insert into person(first_name, last_name, description, role_id) values(?,?,?,(SELECT LAST_INSERT_ID()));";

int[] arr = template.batchUpdate(sql, new BatchPreparedStatementSetter() {

    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        Role role = roles.get(i);
        Person person = list.get(i);
        ps.setObject(1, role.getName());
        ps.setObject(2, role.getCode();
        ps.setObject(3, person.getFirstName());
        ps.setObject(4, person.getLastName());
        ps.setObject(5, person.getDescription());
    }

    @Override
    public int getBatchSize() {
        return list.size()
    }
});

W nim jednak, wszystko odbywa się przy użyciu jednego insertu do bazy danych, a skoro w swoim projekcie mam osobno EmployeeRepo i AddressRepo, nie chciałbym całego jednego SQL`a pakować do EmployeeRepo.

Jak można inaczej podejść do tego tematu?

0

Nie rozumiem w czym problem. Musisz wykonać dokładnie taka sekwencje operacji, jaką podałeś. Dlaczego chcesz pchać cała te logikę do repozytorium zamiast wykonać ją w serwisie?

0

Nie twierdzę że chcę. Ucząc się szukam dobrych praktyk. Chyba mam problem z oddzieleniem co powinno być w repo, a co w serwisie. Mógłbyś mi to nakreślić?

0

Zamiast uczyć się frameworka, ucz się programować. Jeśli widzisz, że jakiś kod nie pasuje do danej klasy, to dlaczego nie stworzysz nowej? To jest pytanie na poziomie programowania obiektowego, nie Javy i nie Springa.

Powinieneś mieć klasę np. RegistrationService, który za pomocą 2 repozytoriów wykonuje ww. logikę.

0

Powinieneś mieć klasę np. RegistrationService, który za pomocą 2 repozytoriów wykonuje ww. logikę.

Ja myśle że to jest troche kwestia "nazewnictwa" bo czymże jest niby Serwis a czym Repozytorium? Nikt nie mówi że musisz mieć 1 tabela = 1 repozytorium. Tak to się robiło kiedyś DAO. Ja osobiście uważam ze lepiej mieć "biznesowe repozytorium" które udostępnia pewien interfejs do wykonywania biznesowych operacji, a nie niskipoziomowych operacji na jakiejś jednej tabeli. Ale to jest dokładnie to samo co @Charles_Ray nazwał RegistrationService. To jest trochę szczegół czy nazwiesz to tak czy inaczej.
Jeśli potrzebujesz mieć te repozytoria na poziomie tabel, to dodajesz sobie taki serwis/repo nad nimi i tyle.

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