hibernate - mapear - persistir enum jpa
Enum campo en la entidad JPA (2)
Me siento un poco tonto al preguntar esto, pero no puedo encontrar una respuesta simple a la pregunta.
Tomemos esta simple entidad como ejemplo:
@Entity
@Table( name="clienti" )
public class Cliente implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String nome;
private String cognome;
//...
}
Representa a una persona, por lo que quiero agregar una propiedad de " género ".
Será "masculino" o "femenino". ¿Y qué?
Puedo usar un String, y tener en cuenta que "m" significa masculino y "f" para femenino.
O puedo usar un booleano "isMale", verdadero o falso.
Sin embargo, no creo que en ningún caso los puristas de Hibernate estén contentos :)
Buscando en Google un poco encontré que la mejor práctica es usar una enumeración .
Estoy un poco confundido sobre cómo usarlo. ¿Puedes ayudarme con un ejemplo?
Puede asignar su enum
a una String
o a un número ordinal. La asignación a String
es el enfoque más portátil, ya que la asignación sobrevivirá cambiando el orden de enumeración.
Usando tu ejemplo:
@Entity
@Table( name="clienti" )
public class Cliente implements Serializable {
...
@Enumerated(EnumType.STRING)
private Gender gender;
...
}
La asignación de cadenas utilizará el nombre simple del tipo de enumeración, por lo que tendría dos valores posibles en el DB: ''Masculino'' y ''Femenino''
public enum Gender { MALE, FEMALE }
El proveedor de persistencia se encarga de la asignación, por lo que en su código, puede continuar usando la enumeración de Gender
y no preocuparse por las cadenas u ordinales.
public enum Gender{
MALE, FEMALE
}
@Entity
@Table( name="clienti" )
public class Cliente implements Serializable {
...
// **1 case** - If database column type is number (integer)
// (some time for better search performance) -> we should use
// EnumType.ORDINAL as @O.Badr noticed. e.g. inserted number will
// index of constant starting from 0... in our example for MALE - 0, FEMALE - 1.
// **Possible issue (advice)**: you have to add the new values at the end of
// your enum, in order to keep the ordinal correct for future values.
@Enumerated(EnumType.ORDINAL)
private Gender gender;
// **2 case** - If database column type is character (varchar)
// and you want to save it as String constant then ->
@Enumerated(EnumType.STRING)
private Gender gender;
...
}
// in all case on code level you will interact with defined
// type of Enum constant but in Database level
primer caso (EnumType.ORDINAL)
╔════╦══════════════╦════════╗
║ ID ║ NAME ║ GENDER ║
╠════╬══════════════╬════════╣
║ 1 ║ Jeff Atwood ║ 0 ║
║ 2 ║ Geoff Dalgas ║ 0 ║
║ 3 ║Jarrod Jesica ║ 1 ║
║ 4 ║ Joel Lucy ║ 1 ║
╚════╩══════════════╩════════╝
segundo caso (EnumType.STRING)
╔════╦══════════════╦════════╗
║ ID ║ NAME ║ GENDER ║
╠════╬══════════════╬════════╣
║ 1 ║ Jeff Atwood ║ MALE ║
║ 2 ║ Geoff Dalgas ║ MALE ║
║ 3 ║Jarrod Jesica ║ FEMALE ║
║ 4 ║ Joel Lucy ║ FEMALE ║
╚════╩══════════════╩════════╝