Spring, JPA, @Inheritance, @Descriptor

0

Witam wszystkich. To mój 1szy projekt w Springu i potrzebuję wsparcia.
mam 3 encje:

  1. Klient
  2. Kandydat
  3. Załącznik
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Attachment {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String path;

  @NotNull
  private String fileName;

  @NotNull
  private String fileMimeType;

  @NotNull
  private Long fileSize;

  @NotNull
  @Lob
  private byte[] file;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClientCard {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String clientAcronym;

  @NotNull
  @Column(columnDefinition="TEXT")
  private String description;

  @NotNull
  @OneToOne(fetch = EAGER)
  @JoinColumn(name = "addressId")
  private PostalAddress address;

  @NotNull
  @OneToMany(cascade = CascadeType.ALL)
  @JoinTable(name = "client_card_attachment",
      joinColumns = { @JoinColumn(name = "client_id") },
      inverseJoinColumns = { @JoinColumn(name = "attachment_id") })
  private Set<Attachment> attachment;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CandidateCard {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String firstName;

  @NotNull
  private String aditionalName;

  @NotNull
  private String lastName;

  @NotNull
  @Size(min = 11, max = 11)
  private String pesel;

  @NotNull
  @Enumerated(value = STRING)
  private MaritalStatus maritalStatus;

  @NotNull
  @OneToOne(fetch = EAGER)
  @JoinColumn(name = "addressId")
  private PostalAddress address;


  public enum MaritalStatus {
    SINGLE, MARRIED, DIVORCED, WIDOWED, OTHER
  }
}

Utknąłem, muszę np. do klienta dodać załącznik. Muszę wiedzieć, że to jest od klienta. Czytam o @Inheritance i @Descriptor i to powinno mi pomóc ale nie potrafię tego zastosować tutaj. Czy muszę stworzyć jakąś bazową abstrakcyjną klasę Osoba z propertiesem id?
Dalej klasę pochodną, zawierającą już stosowne pola dla Klienta, dalej klasę pochodną, zawierającą stosowne pola dla Kandydata?

0

Nie jest ci tutaj potrzebne dziedziczenie, a zwykła relacja, którą zresztą już masz. W Attachmencie dodaj relację do klienta

@ManyToOne

, sprecyzuj zarządzającego relacją za pomocą mappedBy

.
0

potrzebuję dodawać wiele załączników do klienta i do kandydata.
Możesz poprawić w takim razie mój kod, jak to wg. Ciebie winno wyglądać?

Nie do końca rozumiem jak to połączyć bez kluczy obcych w attachment.

0

w attachment dodac

 @ManyToOne
@JoinColumn(name = "clientcard_id")
private ClientCard clientCard;

a w clientcard

  @NotNull
  @OneToMany(mappedBy = "clientCard")
  private Set<Attachment> attachment;

o to chodzilo lectre jak mniemam ;)

0

hcubyc, Lectre
nie wiem czy dobrze Was rozumiem lub czy Wy mnie :)

  1. jeśli mam tabelę klient i tabelę kandydat i do jednej i do drugiej dodam wpis wraz np. z dwoma załącznikami to wiadomo muszę wiedzieć że dany attachment_id jest do tabeli klientów lub kandydatów. Czy Hibernate to jakoś sobie mapuje? Jak to dziala skoro lecą dwa id ( primary ) z dwóch tabel = powielą się id gdy łączymy się z załącznikiem.
    Czy mam zrobić dwie tabele pośredniczące?
    klient_id | attachment_id
    candidate_id | attachment_id
    i siegac do odpowiednich w zależności czego potrzebuję.
    Dlatego pomyślałem o dziedziczeniu by nie tworzyć dwóch tabel gdzie scal id_klient/kandydat - zalacznik
    Dodawanie załączników ma być opcjonalne tzn. np. zakładam kartę kandydata a załączniki później...
    teraz mam taki kod:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Attachment {

  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String path;

  @NotNull
  private String fileName;

  @NotNull
  private String fileMimeType;

  @NotNull
  private Long fileSize;

  @Lob
  private byte[] plik;

  @ManyToOne(fetch = FetchType.LAZY)
  private CandidateCard candidateCard;

  @ManyToOne(fetch = FetchType.LAZY)
  private ClientCard clientCard;

}
<

kandydat

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CandidateCard {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String firstName;

  @NotNull
  private String aditionalName;

  @NotNull
  private String lastName;

  @NotNull
  @Size(min = 11, max = 11)
  private String pesel;

  @NotNull
  @Enumerated(value = STRING)
  private MaritalStatus maritalStatus;

  @NotNull
  @OneToOne(fetch = EAGER, cascade = ALL)
  @JoinColumn(name = "addressId")
  private PostalAddress address;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "candidateCard")
  private Set<Attachment> attachment;

  public enum MaritalStatus {
    SINGLE, MARRIED, DIVORCED, WIDOWED, OTHER
  }
}

klient

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClientCard {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  private Long id;

  @NotNull
  private String clientAcronym;

  @NotNull
  @Column(columnDefinition="TEXT")
  private String description;

  @NotNull
  @OneToOne(fetch = EAGER)
  @JoinColumn(name = "addressId")
  private PostalAddress address;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "clientCard")
  private Set<Attachment> attachment;
}
0

Tak jak napisałeś w pierwszym poście miało by sens. Czyli: Tworzysz abstrakcyjną klasę Person z Inheritance na "TABLE_PER_CLASS" oraz id ze strategy na "TABLE". Obiekty właściwe dziedziczą z Person i nie ustawiają id.
Są też inne typy dziedziczenia.

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