persistir mapear enumerated enum annotation hibernate jpa enums

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 ║ ╚════╩══════════════╩════════╝