2014-02-23 11 views
8

Ich habe versucht, DB-Tabellen mit zufälligen Daten und durch Hibernate zu füllen.Wie man Enum-Wert mit Hibernate in DB speichern?

Aber mein Code fill inkompatible Daten in Tabellen (nicht genau unvereinbar ist es Index dieses Elements bei Enum erklärt, für die Ex: bei ApartmentState - FREE erste Element ist es zu entsprechenden Spalte es Index gesetzt - 0. Aber ich will Put oder FREE als enum oder als String).

Ich konnte nicht herausfinden, warum genau das passiert.

Hier ist Code-Schnipsel:

private List<Apartment> generateApartments() { 
     for (int i = 1; i <= 3; i++) { 
      for (int j = 2; j <= 5; j++) { 
       Apartment apartment = new Apartment(); 
       // fill apartment 
       apartment.setRoomName(generateRoomName()); 
       apartment.setPricePerHour(generatePrice()); 
       apartment.setApartmentState(FREE); 
       apartment.setRating(getDesiredRating(j)); 
       apartment.setSleepPlaces(getDesiredPlaces(i)); 
       apartment.setActive(true); 
       // save apartment 
       apartments.add(apartment); 
      } 
     } 
     return apartments; 
    } 

    private Apartment.SleepPlaces getDesiredPlaces(int i) { 
     switch (i) { 
      case 1: 
       return ONE_PLACE; 
      case 2: 
       return TWO_PLACES; 
      case 3: 
       return THREE_PLACES; 
     } 
     return ONE_PLACE; 
    } 

    private Apartment.StarRating getDesiredRating(int j) { 
     switch (j) { 
      case 2: 
       return TWO_STARS; 
      case 3: 
       return THREE_STARS; 
      case 4: 
       return FOUR_STARS; 
      case 5: 
       return FIVE_STARS; 
     } 
     return TWO_STARS; 
    } 

Ich brauche am Tisch einig ENUM-Werte zu füllen, als Bewertung (2, 3, 4) und Schlafplätze (1, 2 ..).

Aber das bringt einige falsche Daten in die Tabelle. Hier

begnügt sich bei Workbench:

apartment

Warum es nur Index legt, nicht als String oder als Enum.
Wie kann ich dies in Zukunft bei gewünschtem Wert wiederherstellen.

ist hier Schnipsel aus Apartment Klasse:

@Entity 
@Table(name = "Apartments") 
public class Apartment extends AbstractEntity implements Comparable<Apartment> {  
    private Integer id; 
    private String roomName; 
    private Double pricePerHour; 
    private ApartmentState apartmentState; 
    private StarRating rating; 
    private SleepPlaces sleepPlaces; 
    private Boolean active; 

    public enum ApartmentState { 
     FREE, REQUESTED, BOOKED, LIVED, CLEANING, PROCESSING 
    } 

    public enum StarRating { 
     TWO_STARS("2 stars"), THREE_STARS("3 stars"), FOUR_STARS("4 stars"), FIVE_STARS("5 stars"); 

     private String description; 

     private StarRating(String description) { 
      this.description = description; 
     } 
     public String getDescription() { 
      return description; 
     } 
    } 

    public enum SleepPlaces { 
     ONE_PLACE("1 person"), TWO_PLACES("2 persons"), THREE_PLACES("3 persons"), FOUR_PLACES("4 persons"); 

     private String count; 

     private SleepPlaces(String count) { 
      this.count = count; 
     } 
     public String getCount() { 
      return count; 
     } 
    } 

Für mich ist die beste Enum als Enum zu setzen ist (möglicherweise MySQL Workbench) oder als String (und verwenden name() und valueOf() von Enum-Klasse).

Aber wie man es mit Hibernate implementieren.

Wie löst man dieses Problem?

+0

möglich Duplikat [Aufzählungen in Hibernate] (http://stackoverflow.com/questions/417062/enumerations-in-hibernate) –

+0

https://sysdotoutdotprint.wordpress.com/2017/01/25/enumtype-ordinate-vs-enumtype-string/ – mel3kings

Antwort

17

Sie folgende Aufzählung hinzufügen können, wollen zeigen Sie die String-Darstellung beibehalten werden:

@Enumerated(EnumType.STRING) 
private ApartmentState apartmentState; 
2

Verwenden Sie diese Anmerkung auf der Feldebene:

@Enumerated(EnumType.STRING)