Carte enum en JPA avec des valeurs fixes?

Je suis à la recherche pour les différentes façons de la carte une énumération en utilisant JPA. Je tiens tout particulièrement à définir la valeur de l'entier de chaque enum d'entrée et de n'enregistrer que la valeur de l'entier.

@Entity
@Table(name = "AUTHORITY_")
public class Authority implements Serializable {

  public enum Right {
      READ(100), WRITE(200), EDITOR (300);

      private int value;

      Right(int value) { this.value = value; }

      public int getValue() { return value; }
  };

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "AUTHORITY_ID")
  private Long id;

  //the enum to map : 
  private Right right;
}

Une solution simple est d'utiliser le Énumérées annotation avec EnumType.ORDINAL:

@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;

Mais dans ce cas, JPA cartes enum index (0,1,2) et pas de la valeur que je veux (100,200,300).

Th deux solutions que j'ai trouvées ne semblent pas simple...

Première Solution

Une solution, il est proposé ici, utilise @PrePersist et @test de charge de convertir les enum à un autre domaine et la marque de l'enum champ transitoire:

@Basic
private int intValueForAnEnum;

@PrePersist
void populateDBFields() {
  intValueForAnEnum = right.getValue();
}

@PostLoad
void populateTransientFields() {
  right = Right.valueOf(intValueForAnEnum);
}

Deuxième Solution

La deuxième solution il est proposé ici proposé un générique de conversion de l'objet, mais encore semble lourd et hibernate-orienté (@Type ne semblent pas exister dans Java EE):

@Type(
    type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType",
    parameters = {
            @Parameter(
                name  = "enumClass",                      
                value = "Authority$Right"),
            @Parameter(
                name  = "identifierMethod",
                value = "toInt"),
            @Parameter(
                name  = "valueOfMethod",
                value = "fromInt")
            }
)

Est-il d'autres solutions ?

J'ai plusieurs idées en tête mais je ne sais pas si elles existent en JPA:

  • utiliser le setter et getter méthodes de membre de droite de l'Autorité de la Classe lors d'un chargement et d'enregistrement de l'Autorité de l'objet
  • un équivalent idée serait de dire JPA quelles sont les méthodes de Droit enum pour convertir enum pour int et int enum
  • Parce que je suis en utilisant le Printemps, est-il possible de dire JPA d'utiliser un convertisseur (RightEditor) ?
  • Il est étrange d'utiliser ORDINALE quelqu'un parfois change de place les éléments de l'énumération et de la base de données devient une catastrophe
  • ne serait pas le même s'applique à l'utilisation de Nom - que quelqu'un peut changer enum nom(s) et ils sont encore hors de synchronisation avec la base de données...
  • Je suis d'accord avec @NatashaKP. N'utilisez pas de ordinale. Pour changer le nom, il n'y a pas une telle chose. Vous êtes en fait la suppression de l'ancienne enum et de l'ajout d'un nouveau avec un nouveau nom, donc, oui, toutes les données stockées serait hors de la synchronisation (sémantique, peut-être 😛 ).
  • Oui, il y a 5 solutions que je connais. Voir ma réponse ci-dessous, où j'ai une réponse détaillée.
InformationsquelleAutor Kartoch | 2010-05-01