Szukaj…


Parametry

Adnotacja Detale
@Id Zaznacza pole / kolumnę jako klucz encji
@Basic Zaznacza żądane pole do zmapowania jako typ podstawowy . Ma to zastosowanie do prymitywnych typów i ich opakowań, String , Date i Calendar . Adnotacja jest w rzeczywistości opcjonalna, jeśli nie podano żadnych parametrów, ale dobry styl nakazywałby wyraźne wyrażanie twoich intencji.
@Transient Pola oznaczone jako przejściowe nie są uwzględniane pod kątem trwałości, podobnie jak transient słowo kluczowe do serializacji.

Uwagi

Zawsze musi istnieć domyślny konstruktor, czyli parametryczny. W podstawowym przykładzie nie podano konstruktora, więc Java dodał jeden; ale jeśli dodasz konstruktor z argumentami, koniecznie dodaj też konstruktor bez parametrów.

Bardzo prosty byt

@Entity
class Note {
    @Id
    Integer id;
 
    @Basic
    String note;

    @Basic
    int count;
}

Gettery, setery itp. Są zwalniane za zwięzłość, ale i tak nie są potrzebne dla WZP.

Ta klasa Java zostałaby zmapowana do następującej tabeli (w zależności od bazy danych, tutaj podanej w jednym możliwym odwzorowaniu Postgres):

CREATE TABLE Note (
  id integer NOT NULL,
  note text,
  count integer NOT NULL
)

Dostawcy JPA mogą być wykorzystywani do generowania DDL i prawdopodobnie będą wytwarzać DDL inny niż pokazany tutaj, ale dopóki typy są kompatybilne, nie spowoduje to problemów w czasie wykonywania. Najlepiej nie polegać na automatycznym generowaniu DDL.

Pominięcie pola z mapowania

@Entity
class Note {
    @Id
    Integer id;
 
    @Basic
    String note;

    @Transient
    String parsedNote;

    String readParsedNote() {
        if (parsedNote == null) { /* initialize from note */ }
        return parsedNote;
    }
}

Jeśli twoja klasa potrzebuje pól, których nie należy zapisywać w bazie danych, oznacz je jako @Transient . Po odczytaniu z bazy danych pole będzie null .

Czas i data mapowania

Godzina i data są różne w Javie: historyczna Date i Calendar , a także LocalDate i LocalDateTime . Oraz typy Timestamp , Instant , ZonedLocalDateTime i Joda. Po stronie bazy danych mamy time , date i timestamp (zarówno czas, jak i datę), ewentualnie ze strefą czasową lub bez.

Data i godzina przed Java 8

Domyślne odwzorowanie dla typów java.util.Date wcześniejszych niż Java-8, java.util.Calendar i java.sql.Timestamp to timestamp w SQL; dla java.sql.Date jest date .

@Entity
class Times {
    @Id
    private Integer id;

    @Basic
    private Timestamp timestamp;

    @Basic
    private java.sql.Date sqldate;

    @Basic
    private java.util.Date utildate;

    @Basic
    private Calendar calendar;
}

Spowoduje to idealne odwzorowanie do następującej tabeli:

CREATE TABLE times (
    id integer not null,
    timestamp timestamp,
    sqldate date,
    utildate timestamp,
    calendar timestamp
)

To nie może być intencja. Na przykład często Date Java lub Calendar są używane tylko do przedstawienia daty (daty urodzenia). Aby zmienić domyślne mapowanie lub po prostu wyraźne mapowanie, możesz użyć adnotacji @Temporal .

@Entity
class Times {
    @Id
    private Integer id;

    @Temporal(TemporalType.TIME)
    private Date date;

    @Temporal(TemporalType.DATE)
    private Calendar calendar;
}

Odpowiednik tabeli SQL to:

CREATE TABLE times (
    id integer not null,
    date time,
    calendar date
)

Uwaga 1: Typ określony w @Temporal wpływa na generowanie DDL; ale możesz też utworzyć @Basic date na Date używając tylko adnotacji @Basic .

Uwaga 2: Calendar nie może utrzymywać wyłącznie time .

Data i godzina w Javie 8

JPA 2.1 nie definiuje obsługi typów java.time dostępnych w Javie 8. Większość implementacji JPA 2.1 oferuje wsparcie dla tych typów, chociaż są to ściśle rozszerzenia rozszerzeń dostawców.

W przypadku DataNucleus te typy działają po wyjęciu z pudełka i oferują szeroki zakres możliwości mapowania, w połączeniu z adnotacją @Temporal .

W przypadku Hibernacji, jeśli używasz Hibernacji 5.2+, powinny działać od @Basic po prostu, używając adnotacji @Basic . Jeśli używasz Hibernate 5.0-5.1, musisz dodać zależność org.hibernate:hibernate-java8 . Dostarczone mapowania to

  • LocalDate do date
  • Instant , LocalDateTime i ZonedDateTime do timestamp

Alternatywą niezależną od dostawcy byłoby także zdefiniowanie java.time AttributeConverter JPA 2.1 dla dowolnego typu Java 8 java.time który musi zostać utrwalony.

Podmiot z identyfikatorem zarządzanym sekwencją

Tutaj mamy klasę i chcemy, aby pole tożsamości ( userUid ) generowało swoją wartość za pomocą SEKWENCJI w bazie danych. Zakłada się, że ta SEKWENCJA nazywa się USER_UID_SEQ i może być utworzona przez DBA lub może być utworzona przez dostawcę JPA.

@Entity
@Table(name="USER")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="USER_UID_GENERATOR", sequenceName="USER_UID_SEQ")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_UID_GENERATOR")
    private Long userUid;

    @Basic
    private String userName;
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow