java - @embeddedid
Anotaciones Java-JPA @Basic y @ Embedded (3)
Estoy aprendiendo JPA de este tutorial .
Tengo algunas confusiones en la comprensión de las siguientes anotaciones:
@Basic
-
@Embedded
Los campos de un tipo incrustable son por defecto persistentes, como si estuvieran anotados con @Embedded.
Si los campos de tipos incrustables son predeterminados a persistentes, entonces ¿por qué necesitaríamos la anotación @Embedded
@BASIC
La anotación básica se puede aplicar a una propiedad persistente o variable de instancia de cualquiera de los siguientes tipos:
Tipos primitivos de Java, envoltorios de los tipos primitivos, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java. sql.Timestamp, byte [], Byte [], char [], Character [], enumeraciones y cualquier otro tipo que implemente java.io.Serializable.
El uso de la anotación básica es opcional para los campos persistentes y las propiedades de estos tipos. Si la anotación Básica no está especificada para dicho campo o propiedad, se aplicarán los valores predeterminados de la anotación Básica.
Ejemplo:
@Basic
protected String name;
y
@Basic(fetch=LAZY)
protected String getName() {
return name;
}
@Incrustado
Especifica un campo o propiedad persistente de una entidad cuyo valor es una instancia de una clase incrustable. La clase incrustable debe anotarse como Embeddable.
Ejemplo 1:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", column=@Column("EMP_START")),
@AttributeOverride(name="endDate", column=@Column("EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
Ejemplo 2:
@Entity
public class Project {
@EmbeddedId ProjectId id;
//other fields
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}
En el mapeo ORM, la granularidad de su modelo de objetos puede ser más fina que la de su base de datos.
Por ejemplo, puede tener un registro de Person
en su base de datos que puede descomponerse más para contener una referencia a un objeto de Address
en su modelo. Ahí es donde @Embeddable
anotaciones @Embedded
y @Embeddable
. Simplemente establecen una relación donde una Entity
se puede almacenar como parte de otra.
En cuanto a la anotación @Basic
, es la forma más simple de mapeo que se aplica por defecto a tipos primitivos como int y float y sus wrappers, así como enums. Se puede obtener más información aquí: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property
La anotación @Embeddable
permite especificar una clase cuyas instancias se almacenan como parte intrínseca de la entidad propietaria. Esta anotación no tiene atributos .
@Embeddable
public class EmploymentPeriod {
java.util.Date startDate;
java.util.Date endDate;
...
}
La anotación @Embedded
se usa para especificar un campo persistente o propiedad de una entidad cuyo valor es una instancia de una clase incrustable. De forma predeterminada, las definiciones de columna especificadas en la clase @Embeddable
aplican a la tabla de la entidad propietaria pero puede @AttributeOverride
mediante @AttributeOverride
:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
@AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
Con respecto a la anotación @Basic
opcional, puede usarla para configurar el tipo de búsqueda en LAZY
y configurar la asignación para prohibir valores nulos (para tipos no primitivos) con el atributo optional
.
@Basic(fetch=LAZY)
protected String getName() { return name; }
También puede colocarlo en un campo o propiedad para marcarlo explícitamente como persistente (para fines de documentación).