Buscar..


Parámetros

Anotación Detalles
@Id Marca el campo / columna como la clave de la entidad.
@Basic Marks campo solicitado para mapear como un tipo básico . Esto es aplicable a los tipos primitivos y sus envoltorios, String , Date y Calendar . La anotación es en realidad opcional si no se dan parámetros, pero un buen estilo dictaría que sus intenciones sean explícitas.
@Transient Los campos marcados como transitorios no se consideran para la persistencia, al igual que la palabra clave transient para la serialización.

Observaciones

Siempre debe haber un constructor predeterminado, es decir, el que no tiene parámetros. En el ejemplo básico, no se especificó ningún constructor, por lo que Java agregó uno; pero si agrega un constructor con argumentos, asegúrese de agregar también el constructor sin parámetros.

Una entidad muy simple

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

    @Basic
    int count;
}

Los buscadores, los colocadores, etc., se omiten por brevedad, pero de todos modos no son necesarios para la APP.

Esta clase de Java se asignaría a la siguiente tabla (dependiendo de su base de datos, aquí en una posible asignación de Postgres):

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

Los proveedores de JPA se pueden usar para generar el DDL, y es probable que produzcan un DDL diferente al que se muestra aquí, pero mientras los tipos sean compatibles, esto no causará problemas en el tiempo de ejecución. Es mejor no confiar en la autogeneración de DDL.

Omitiendo el campo de la cartografía.

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

    @Transient
    String parsedNote;

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

Si su clase necesita campos que no deben escribirse en la base de datos, @Transient como @Transient . Después de leer de la base de datos, el campo será null .

Asignación de hora y fecha

La hora y la fecha vienen en varios tipos diferentes en Java: La Date y el Calendar ahora históricos, y el LocalDate y LocalDateTime más recientes. Y Timestamp , Instant , ZonedLocalDateTime y los tipos de tiempo Joda. En el lado de la base de datos, tenemos time , date y timestamp (tanto hora como fecha), posiblemente con o sin zona horaria.

Fecha y hora antes de Java 8

La asignación predeterminada para los tipos pre-Java-8 java.util.Date , java.util.Calendar y java.sql.Timestamp es la timestamp de timestamp en SQL; para java.sql.Date es 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;
}

Esto se asignará perfectamente a la siguiente tabla:

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

Esta puede no ser la intención. Por ejemplo, a menudo se usa una Date o Calendar Java para representar la fecha solamente (para la fecha de nacimiento). Para cambiar la asignación predeterminada, o simplemente para hacer explícita la asignación, puede usar la anotación @Temporal .

@Entity
class Times {
    @Id
    private Integer id;

    @Temporal(TemporalType.TIME)
    private Date date;

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

La tabla SQL equivalente es:

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

Nota 1: El tipo especificado con @Temporal influye en la generación de DDL; pero también puede tener una columna de tipo date map to Date con solo la anotación @Basic .

Nota 2: El Calendar no puede persistir solo el time .

Fecha y hora con Java 8

JPA 2.1 no define el soporte para los tipos java.time proporcionados en Java 8. Sin embargo, la mayoría de las implementaciones de JPA 2.1 ofrecen soporte para estos tipos, aunque estas son, estrictamente hablando, extensiones de proveedores.

Para DataNucleus, estos tipos simplemente funcionan fuera de la caja y ofrecen una amplia gama de posibilidades de mapeo, junto con la anotación @Temporal .

Para Hibernate, si usa Hibernate 5.2+, deberían trabajar fuera de la caja, simplemente usando la anotación @Basic . Si usa Hibernate 5.0-5.1, debe agregar la dependencia org.hibernate:hibernate-java8 . Las asignaciones proporcionadas son

  • LocalDate hasta la date
  • Instant , LocalDateTime y ZonedDateTime para timestamp de timestamp

Una alternativa neutral para el proveedor también sería definir un AttributeConverter JPA 2.1 para cualquier tipo de Java 8 java.time que deba persistir.

Entidad con id de secuencia gestionada

Aquí tenemos una clase y queremos que el campo de identidad ( userUid ) tenga su valor generado a través de una SECUENCIA en la base de datos. Se supone que esta SECUENCIA se denomina USER_UID_SEQ , y puede ser creada por un DBA, o puede ser creada por el proveedor de 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow