Jpa. Rozplanowanie encji.

0

Siemka piszę sobie cruda. Na początku miałem encję Account i Patient. Encja Account miała w sobie pole Patient. Teraz dodałem encję Doctor i chciałem to w miarę sensownie rozplanować. Chodzi mi o to, że wcześniej gdy miałem tylko Patient to pole Patient w encjii Account załatwiało sprawę. Nie wiem czy dobrze zobrazowałem o co mi chodzi. Wkleiłem kod przykładowych klas. Oczywiście mój kod nie ma tak mało pól chodzi mi tylko o idee jak powinno się przechowywać konta i różnych użytkowników.

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String login;
    private String password;
    
    private String role;
    
    @OneToOne(cascade = CascadeType.ALL)
    private User user;
    
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Doktor extends User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String specialization;

}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Patient extends User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private String pesel;

    private String email;
    
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public abstract  class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String firstName;
    private String lastName;

}
0

Rozpisz use case bo nie rozumiem co chcesz zrobić. Dlaczego w Account ma być jednocześnie pacjent i doktor?

Moze rozplanuj to inaczej? Niech pacjent ma historiie choroby, dla kazdej dziedziny (w historii) bedzie przypisany obecnie jeden lekarz. Ale pamietaj ze lekarze w dziedzinach moga sie zmieniac.

1

Jak nie podasz przypadków użycia aplikacji, to na jakiej podstawie mamy określić optymalny model?

0

Pacjent to pacjent, doktor to doktor, a konto w aplikacji to konto w aplikacji. Troche bez sensu jest to łączyć ze sobą. Dorób se User i problem z głowy

Edit: w sumie User to pewnie to samo co konto xD tak czy inaczej, nie łączył bym tego tak ściśle

1

Może napisz jak chcesz żeby to wyglądało. Bez żadnych odniesień do javy, struktury bazy itp. Zwyczajnie z poziomu działania apki. Bo mam wrażenie, że niesamowicie sobie namieszałeś i przydałby się restart do punktu startowego ;p

0

Żebyś wiedział, że przydałby mi się restart. No to tak. Tworzę sobie konto. Zależnie czy wybrałem tworzenie konta dla doktora czy pacjenta mam inne pola do wypełnienia. Załóżmy, że wszystko przebiegło pomyślnie mam swój nick oraz hasło a po ponownym zalogowaniu widzę swoje dane które wpisałem podczas logowania. Robię na koncie jakieś operacje, a po wylogowaniu i ponownym zalogowaniu widzę co zrobiłem. Całe moje niezrozumienie polega na tym, że po zrobieniu usera który ma login i hasło po zalogowaniu nie mam żadnych informacji kim jestem (oprócz mojego loginu i id). Mam tylko zależnie od roli dostęp do różnych endpointów. Wcześniej gdy miałem tylko Pacjenta bez Doktora to po prostu do konta był przypisany pacjent przez utworzenie pola Pacjent w Encji Account. Gdy dodawałem nowego pacjenta robiłem coś takiego.Dlatego próbowałem zrobić encję Account która ma login hasło oraz usera. Doktor i Pacjent rozszerzali usera i mógłbym do danego konta przypisać Pacjenta lub Doktora.

    @Override
    @Transactional
    public Long addPatient(PatientDto patientDto, String username) {

        Account account=accountRepository.findByLogin(username);
        Patient patient = account.getPatient();
        Patient afterMapping=new Patient();

        if(patient !=null){
             afterMapping = PatientMapper.mapPatientDtoToPatient(patient,patientDto);
        }else{
            afterMapping = PatientMapper.mapPatientDtoToPatient(new Patient(),patientDto);
        }

        account.setPatient(afterMapping);
        Account newAccount= accountRepository.save(account);

        return newAccount.getPatient().getId();
    }

0
Account account=accountRepository.findByLogin(username);

Tego nie czaję. Masz proces rejestracji nowego Pacjenta, a wyszukujesz go już po loginie? To jest jakiś proces wielokrokowy? Najpierw tworzysz konto i nie określasz typu? Dlaczego tak? Nie możesz tworzyć konta po prostu jedną komendą?

0

Tutaj username to nazwa z Principal. Do konta o podanym loginie zapisywałem pacjenta.

@PostMapping("/register")
    public Long addPatient(@RequestBody PatientDto patientDto,Principal principal){

        String userName = principal.getName();

        return patientService.addPatient(patientDto,userName);

    }

0

Ok a dlaczego np pacjent nie może być sam w sobie kontem tylko z innym typem/rolą niż doktor? Po co to przypisywanie? Chcesz mieć osobna tabele na dane uwierzytelniania i osobne na resztę danych?

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