Estoy empezando con
JPA de
java y encontré en
debugmodeon una excelente explicación sobre las entidades en JPA. Quiero aclarar que lo que voy a poner no fue creado por mí sino que lo copie del sitio anteriormente mencionado.
Para que un
Java Bean pueda ser guardado en una base de datos debe ser anotado como
@Entity.
Una entidad debe cumplir una serie de restricciones como, por ejemplo, tener un constructor vacío, ya sea
público o
protegido, poseer un campo que sea
clave primaria,
@Id. Veamos un ejemplo:
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
...
public Usuario() { }
// Getters y Setters
}
La mayoría de motores de persistencia para JPA permiten omitir la declaración del constructor vacío.
La anotación
@Table nos permite especificar el nombre de la tabla donde se persistirá la entidad, permite seguir la especificación de clases en singular y tablas en plural, si no está incluida la entidad se persistirá en una tabla que coincida con el nombre de la clase. La anotación
@Id marca el identificador de la clase, es decir, su
clave primaria.
Además, JPA define que los tipos primitivos, clases "envoltorio" de tipos primitivos,
java.lang.String,
byte[],
Byte[],
char[],
Character[],
java.math.BigDecimal,
java.math.BigInteger,
java.util.Date,
java.util.Calendar,
java.sql.Date,
java.sql.Timestamp son mapeados de forma automática en columnas, es decir, no es necesario marcarlos. Además todos aquellos objetos que sean de tipo
Serializable y estén marcados con la anotación
@Basic.
Si lo que queremos es que una variable, de las que son mapeadas de forma automática, no sea tomada como un campo deberemos usar la anotación
@Transient.
JPA incluye formas de mapear cada campo indicando nombres de columna y otros valores.
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
@Column(name="PASSWORD", nullable=false)
private String pass;
@Column(name="E-MAIL", nullable=false)
private String mail;
@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] imagen;
...
public Usuario() { }
// Getters y Setters
}
La anotación
@Column permite definir varias propiedades. La propiedad
name especifica el nombre de la columna donde va a ser persistido el campo, si esta propiedad no está presente el framework de persistencia usará el nombre de la variable como nombre de la columna. La propiedad
nullable indica si la columna acepta valores
null o no, si no se incluye el valor por defecto es
true. Además esta anotación soporta otras muchas propiedades como pueden ser
columnDefinition,
length,
precision,
scale,
insertable,
updatable y
table.
La anotación
@Basic permite, además de lo dicho anteriormente, definir las propiedades opcional y fetch. La propiedad optional funciona igual que la propiedad nullable de la anotación
@Column. La propiedad fetch permite definir cuando se debe cargar el campo en cuestión, el valor FetchType. Lazy indica que el campo se va a cargar de forma "perezosa". El valor
FetchType.EAGER indica que el valor será cargado cuando se cargue el resto del objeto. El valor por defecto de la propiedad fetch es
FetchType.EAGER.
La anotación
@Lob indica que el contenido de un campo básico será guardado como
LOB (
Large OBject). Si por ejemplo utilizamos esta anotación para marcar un campo que contenta un String o caracteres el framework lo mapeará a una columna
CLOB (
Character Large OBject). Si es de otro tipo será mapeado a una columna de tipo
BLOB (
Binary Large OBject).
Referencia original:
debugmodeon