sammensatte primære nøgler i JPA
introduktion
i denne vejledning lærer vi om sammensatte primære nøgler og de tilsvarende kommentarer i JPA.
sammensatte primære nøgler
en sammensat primær nøgle – også kaldet en sammensat nøgle – er en kombination af to eller flere kolonner for at danne en primær nøgle til en tabel.
i JPA har vi to muligheder for at definere de sammensatte nøgler: @IdClass og @EmbeddedId annotationer.
for at definere de sammensatte primære nøgler skal vi følge nogle regler:
- den sammensatte primære nøgleklasse skal være offentlig
- den skal have en no-arg – konstruktør
- den skal definere lig med() og hashCode() metoder
- den skal være Serialiserbar
Idclass – annotationen
lad os sig, at vi har en tabel kaldet konto, og den har to kolonner-kontonummer, kontotype-der danner den sammensatte nøgle. Nu skal vi kortlægge det i JPA.
i henhold til JPA-specifikationen, lad os oprette en AccountId-klasse med disse primære nøglefelter:
public class AccountId implements Serializable { private String accountNumber; private String accountType; // default constructor public AccountId(String accountNumber, String accountType) { this.accountNumber = accountNumber; this.accountType = accountType; } // equals() and hashCode()}
lad os derefter knytte AccountId-klassen til enhedskontoen.
for at gøre det skal vi kommentere enheden med @IdClass-annotationen. Vi skal også erklære felterne Fra AccountId-klassen på enhedskontoen og kommentere dem med @Id:
@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}
EmbeddedId-annotationen
@EmbeddedId er et alternativ til @IdClass-annotationen.
lad os overveje et andet eksempel, hvor vi skal fortsætte nogle oplysninger om en bog med titel og sprog som de primære nøglefelter.
i dette tilfælde skal den primære nøgleklasse, BookId, kommenteres med @Embeddable:
@Embeddablepublic class BookId implements Serializable { private String title; private String language; // default constructor public BookId(String title, String language) { this.title = title; this.language = language; } // getters, equals() and hashCode() methods}
derefter skal vi integrere denne klasse i Bogenheden ved hjælp af @EmbeddedId:
@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}
@IdClass vs @EmbeddedId
som vi lige så, er forskellen på overfladen mellem disse to, at med @IdClass måtte vi angive kolonnerne to gange – en gang i AccountId og igen i Konto. Men med @EmbeddedId gjorde vi det ikke.
der er dog nogle andre kompromiser.
disse forskellige strukturer påvirker f.eks.
for eksempel med @IdClass er forespørgslen lidt enklere:
SELECT account.accountNumber FROM Account account
med @EmbeddedId skal vi gøre en ekstra gennemgang:
SELECT book.bookId.title FROM Book book
@IdClass kan også være ret nyttigt på steder, hvor vi bruger en sammensat nøgleklasse, som vi ikke kan ændre.
endelig, hvis vi får adgang til dele af den sammensatte nøgle individuelt, kan vi gøre brug af @IdClass, men på steder, hvor vi ofte bruger den komplette identifikator som et objekt, foretrækkes @EmbeddedId.
konklusion
i denne hurtige artikel udforsker vi sammensatte primære nøgler i JPA.
som altid kan den komplette kode til denne artikel findes på Github.