Recherche…


Paramètres

Annotation Détails
@Id Champ / colonne de marques en tant que clé de l'entité
@Basic Champ demandé à mapper en tant que type de base . Ceci est applicable aux types primitifs et à leurs wrappers, String , Date et Calendar . L'annotation est facultative si aucun paramètre n'est donné, mais un bon style dicterait pour que vos intentions soient explicites.
@Transient Les champs marqués comme transitoires ne sont pas pris en compte pour la persistance, un peu comme le mot-clé transient pour la sérialisation.

Remarques

Il doit toujours y avoir un constructeur par défaut, c’est-à-dire sans constructeur. Dans l'exemple de base, aucun constructeur n'a été spécifié, alors Java en a ajouté un; mais si vous ajoutez un constructeur avec des arguments, veillez à ajouter également le constructeur sans paramètre.

Une entité très simple

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

    @Basic
    int count;
}

Les Getters, les Setters, etc.

Cette classe Java correspondrait au tableau suivant (en fonction de votre base de données, donnée ici dans un possible mappage Postgres):

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

Les fournisseurs JPA peuvent être utilisés pour générer le DDL et produiront probablement du DDL différent de celui présenté ici, mais tant que les types sont compatibles, cela ne causera pas de problèmes lors de l'exécution. Il est préférable de ne pas compter sur l'auto-génération de DDL.

Omettre le champ de la cartographie

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

    @Transient
    String parsedNote;

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

Si votre classe a besoin de champs qui ne doivent pas être écrits dans la base de données, marquez-les comme @Transient . Après avoir lu la base de données, le champ sera null .

Mappage de l'heure et de la date

L'heure et la date sont de différents types en Java: la Date et le Calendar désormais historiques, et les LocalDate plus récentes LocalDate et LocalDateTime . Et les types Timestamp , Instant , ZonedLocalDateTime et Joda-time. Du côté de la base de données, nous avons l' time , la date et l' timestamp (heure et date), éventuellement avec ou sans fuseau horaire.

Date et heure avant Java 8

Le mappage par défaut des types pré-Java- java.util.Date , java.util.Calendar et java.sql.Timestamp est timestamp in SQL; pour java.sql.Date c'est 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;
}

Cela correspondra parfaitement au tableau suivant:

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

Cela peut ne pas être l'intention. Par exemple, une Date ou un Calendar Java est souvent utilisé pour représenter la date uniquement (pour la date de naissance). Pour modifier le mappage par défaut ou simplement pour rendre le mappage explicite, vous pouvez utiliser l'annotation @Temporal .

@Entity
class Times {
    @Id
    private Integer id;

    @Temporal(TemporalType.TIME)
    private Date date;

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

La table SQL équivalente est:

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

Note 1: Le type spécifié avec @Temporal influence la génération de DDL; mais vous pouvez aussi avoir une colum de type type date à Date avec juste l'annotation @Basic .

Note 2: Le Calendar ne peut pas persister uniquement l' time .

Date et heure avec Java 8

JPA 2.1 ne définit pas la prise en java.time types java.time fournis en Java 8. La majorité des implémentations JPA 2.1 prennent toutefois en charge ces types, bien qu'il s'agisse à proprement parler d'extensions de fournisseurs.

Pour DataNucleus, ces types fonctionnent simplement et offrent un large éventail de possibilités de mappage, @Temporal annotation @Temporal .

Pour Hibernate, si vous utilisez Hibernate 5.2+, ils devraient fonctionner @Basic avec l'annotation @Basic . Si vous utilisez Hibernate 5.0-5.1, vous devez ajouter la dépendance org.hibernate:hibernate-java8 . Les mappages fournis sont

  • LocalDate à date
  • Instant , LocalDateTime et ZonedDateTime à l' timestamp

Une alternative java.time fournisseur consisterait également à définir un JPA 2.1 AttributeConverter pour tout type Java 8 java.time devant être conservé.

Entité avec ID géré par séquence

Ici, nous avons une classe et nous voulons que le champ d'identité ( userUid ) soit généré via une SEQUENCE dans la base de données. Cette SEQUENCE est supposée s'appeler USER_UID_SEQ et peut être créée par un administrateur de base de données ou peut être créée par le fournisseur 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow