Ricerca…


Parametri

Annotazione Dettagli
@Id Segna il campo / colonna come chiave dell'entità
@Basic Segna il campo richiesto per mapparlo come tipo base . Questo è applicabile ai tipi primitivi e ai loro wrapper, String , Date e Calendar . L'annotazione è effettivamente facoltativa se non vengono forniti parametri, ma un buon stile imporrebbe di rendere esplicite le tue intenzioni.
@Transient I campi contrassegnati come transitori non sono considerati per la persistenza, proprio come la parola chiave transient per la serializzazione.

Osservazioni

C'è sempre bisogno di essere un costruttore predefinito, cioè quello senza parametri. Nell'esempio di base, non è stato specificato alcun costruttore, quindi Java ne ha aggiunto uno; ma se aggiungi un costruttore con argomenti, assicurati di aggiungere anche il costruttore senza parametri.

Un'entità molto semplice

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

    @Basic
    int count;
}

Getters, setter, ecc. Sono ammessi per brevità, ma non sono comunque necessari per JPA.

Questa classe Java si assocerebbe alla seguente tabella (a seconda del database, qui indicato in una possibile mappatura di Postgres):

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

I provider JPA possono essere utilizzati per generare il DDL e probabilmente genereranno DDL diverso da quello mostrato qui, ma finché i tipi sono compatibili, ciò non causerà problemi in fase di runtime. È meglio non fare affidamento sull'auto-generazione di DDL.

Omettendo il campo dalla mappatura

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

    @Transient
    String parsedNote;

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

Se la tua classe ha bisogno di campi che non dovrebbero essere scritti nel database, contrassegnali come @Transient . Dopo aver letto dal database, il campo sarà null .

Mappatura di ora e data

Ora e data sono disponibili in diversi tipi in Java: la Date e il Calendar ormai storici e i più recenti LocalDate e LocalDateTime . E Timestamp , Instant , ZonedLocalDateTime e i tipi Joda-time. Sul lato del database, abbiamo time , date e timestamp (sia per ora che per data), possibilmente con o senza fuso orario.

Data e ora prima di Java 8

Il mapping predefinito per i tipi pre-Java-8 java.util.Date , java.util.Calendar e java.sql.Timestamp è il timestamp in SQL; per java.sql.Date è la 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;
}

Questo si mapperà perfettamente alla seguente tabella:

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

Questo potrebbe non essere l'intenzione. Ad esempio, spesso viene utilizzata una Date o un Calendar Java per rappresentare solo la data (per la data di nascita). Per modificare la mappatura predefinita o solo per rendere esplicita la mappatura, è possibile utilizzare l'annotazione @Temporal .

@Entity
class Times {
    @Id
    private Integer id;

    @Temporal(TemporalType.TIME)
    private Date date;

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

La tabella SQL equivalente è:

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

Nota 1: il tipo specificato con @Temporal influenza la generazione DDL; ma puoi anche avere una colonna di tipo date map to Date con solo l'annotazione @Basic .

Nota 2: il Calendar non può mantenere solo il time .

Data e ora con Java 8

JPA 2.1 non definisce il supporto per i tipi java.time forniti in Java 8. La maggior parte delle implementazioni di JPA 2.1 offre tuttavia supporto per questi tipi, sebbene si tratti di estensioni dei produttori in senso stretto.

Per DataNucleus, questi tipi funzionano appena fuori dagli schemi e offrono una vasta gamma di possibilità di mappatura, in @Temporal con l'annotazione @Temporal .

Per Hibernate, se usi Hibernate 5.2+, dovrebbero funzionare immediatamente, usando solo l'annotazione @Basic . Se si utilizza Hibernate 5.0-5.1 è necessario aggiungere la dipendenza org.hibernate:hibernate-java8 . Le mappature fornite sono

  • LocalDate fino ad date
  • Instant , LocalDateTime e ZonedDateTime su timestamp

Un'alternativa indipendente dal fornitore sarebbe anche quella di definire un AttributeConverter JPA 2.1 per qualsiasi tipo java.time Java 8 che è necessario mantenere.

Entità con ID gestito in sequenza

Qui abbiamo una classe e vogliamo che il campo identità ( userUid ) abbia il suo valore generato tramite un SEQUENCE nel database. Si presume che questa SEQUENZA sia denominata USER_UID_SEQ e può essere creata da un DBA o creata dal provider 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow