Suche…


Parameter

Anmerkung Einzelheiten
@Id Markiert Feld / Spalte als Schlüssel der Entität
@Basic Marks angeforderte Feld als Basistyp zugeordnet. Dies gilt für primitive Typen und deren Wrapper, String , Date und Calendar . Die Anmerkung ist eigentlich optional, wenn keine Parameter angegeben werden. Ein guter Stil würde jedoch dazu führen, dass Ihre Absichten explizit gemacht werden.
@Transient Felder, die als transient markiert sind, werden nicht als persistent betrachtet, ähnlich wie das transient Schlüsselwort für die Serialisierung.

Bemerkungen

Es muss immer einen Standardkonstruktor geben, dh den parameterlosen. Im grundlegenden Beispiel wurde kein Konstruktor angegeben. Java fügte einen hinzu. Wenn Sie jedoch einen Konstruktor mit Argumenten hinzufügen, müssen Sie auch den parameterlosen Konstruktor hinzufügen.

Eine sehr einfache Entität

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

    @Basic
    int count;
}

Getter, Setter usw. sind aus Gründen der Kürze nicht vorgesehen, werden aber für JPA ohnehin nicht benötigt.

Diese Java-Klasse würde der folgenden Tabelle zugeordnet werden (abhängig von Ihrer Datenbank, hier in einer möglichen Postgres-Zuordnung):

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

JPA-Provider können zum Generieren der DDL verwendet werden und erzeugen wahrscheinlich andere DDL als die hier gezeigte. Solange die Typen jedoch kompatibel sind, führt dies zur Laufzeit nicht zu Problemen. Es ist am besten, sich nicht auf die automatische Generierung von DDL zu verlassen.

Feld aus der Zuordnung auslassen

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

    @Transient
    String parsedNote;

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

Wenn Ihre Klasse Felder benötigt, die nicht in die Datenbank geschrieben werden sollen, markieren Sie sie als @Transient . Nach dem Lesen aus der Datenbank ist das Feld null .

Zuordnungszeit und Datum

Zeit und Datum gibt es in Java in einer Reihe verschiedener Typen: Das jetzt historische Date und der aktuelle Calendar sowie das aktuellere LocalDate und LocalDateTime . Und Timestamp , Instant , ZonedLocalDateTime und die Joda- ZonedLocalDateTime . Auf der Datenbankseite haben wir time , date und timestamp (sowohl Zeit als auch Datum), möglicherweise mit oder ohne Zeitzone.

Datum und Uhrzeit vor Java 8

Die Standardzuordnung für die Pre-Java-8-Typen java.util.Date , java.util.Calendar und java.sql.Timestamp ist der timestamp in SQL. für java.sql.Date es 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;
}

Dies wird der folgenden Tabelle perfekt zugeordnet:

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

Dies kann nicht die Absicht sein. Beispielsweise wird ein Java- Date oder Calendar häufig nur zur Darstellung des Datums (für das Geburtsdatum) verwendet. Um die Standardzuordnung zu ändern oder um die Zuordnung explizit zu machen, können Sie die Annotation @Temporal .

@Entity
class Times {
    @Id
    private Integer id;

    @Temporal(TemporalType.TIME)
    private Date date;

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

Die äquivalente SQL-Tabelle ist:

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

Hinweis 1: Der mit @Temporal angegebene @Temporal beeinflusst die DDL-Generierung. Sie können aber auch einen colum vom Typ haben date Karte Date nur mit der @Basic Anmerkung.

Hinweis 2: Der Calendar kann nicht nur die time beibehalten.

Datum und Uhrzeit mit Java 8

In JPA 2.1 ist keine Unterstützung für java.time Typen definiert, die in Java 8 bereitgestellt werden. Die meisten Implementierungen von JPA 2.1 bieten jedoch Unterstützung für diese Typen. Allerdings handelt es sich hierbei streng um Herstellererweiterungen.

Für DataNucleus sind diese Typen einfach @Temporal und bieten eine Vielzahl von Mapping-Möglichkeiten, die mit der @Temporal Annotation @Temporal .

Wenn Sie Hibernate 5.2 oder höher verwenden, sollten Sie sofort mit der @Basic Annotation arbeiten. Wenn Sie Hibernate 5.0-5.1 verwenden, müssen Sie die Abhängigkeit org.hibernate:hibernate-java8 hinzufügen org.hibernate:hibernate-java8 . Die bereitgestellten Zuordnungen sind

  • LocalDate bis date
  • Instant , LocalDateTime und ZonedDateTime zum timestamp

Eine herstellerneutrale Alternative wäre auch die Definition eines JPA 2.1 AttributeConverter für jeden Java 8-Typ von java.time , der persistent sein muss.

Entität mit sequenzverwalteter ID

Hier haben wir eine Klasse und wir möchten, dass das Identitätsfeld ( userUid ) über eine SEQUENCE in der Datenbank generiert wird. Es wird angenommen, dass diese SEQUENCE als USER_UID_SEQ wird und von einem DBA oder vom JPA-Provider erstellt werden kann.

@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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow