2014-02-23 77 views
8

我試圖用隨機數據和Hibernate填充數據庫表。如何使用Hibernate將枚舉值保存到數據庫?

但我的代碼填充不兼容的數據到表中(不完全兼容它在枚舉聲明該元素的索引,爲前:在ApartmentState - FREE是將其設置爲相應的列其指數第一要素 - 0。但我想放置或FREE作爲枚舉或作爲字符串)。

我搞不​​明白爲什麼會發生這種情況。

這裏是代碼片斷:

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; 
    } 

我需要填充在表中的一些枚舉值,作爲等級(2,3,4)和睡眠的地方(1,2 ...)。

但是這將一些錯誤的數據放入表中。

這裏是一個工作臺內容:

apartment

爲什麼它把唯一指標,而不是作爲字符串或枚舉。
我如何在未來恢復到期望的價值。

這裏是公寓類片段:

@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; 
     } 
    } 

對我來說,最好是把枚舉爲ENUM(可能在MySQL工作臺)或字符串(和使用name()valueOf()從Enum類)。

但是如何用hibernate實現它。

如何解決這個問題?

+0

[Hibernate中枚舉(可能重複http://stackoverflow.com/questions/417062/enumerations-in-hibernate) –

+0

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

回答

17

您可以添加以下枚舉,以表明你想要的String表示要永久保存:

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

使用此批註在實地一級:

@Enumerated(EnumType.STRING) 
相關問題