如何使用Hibernate保存枚举值到DB? [英] how to save enum value to DB with Hibernate?

查看:166
本文介绍了如何使用Hibernate保存枚举值到DB?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



但是我的代码将不兼容的数据填充到表中(不完全不兼容的是它声明的这个元素的索引at enum,for ex:at ApartmentState - 是第一个元素,它设置为适当的列it index - 我想把或 FREE 作为枚举或字符串)。



我不知道为什么



以下是代码段:

 私人列表< ; generateApartments(){
for(int i = 1; i <= 3; i ++){
for(int j = 2; j <= 5; j ++){
= new Apartment();
//填写公寓
apartment.setRoomName(generateRoomName());
apartment.setPricePerHour(generatePrice());
apartment.setApartmentState(FREE);
apartment.setRating(getDesiredRating(j));
apartment.setSleepPlaces(getDesiredPlaces(i));
apartment.setActive(true);
//保存公寓
apartments.add(apartment);
}
}
退房公寓;
}

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



我需要在表中填充一些枚举值, ,4)和睡眠位置(1,2 ..)。



但这会将一些错误的数据放入表中。



以下是workbench的内容:





为什么它只显示索引,不是字符串或枚举。



以下是公寓类别的摘要:

  @Entity 
@Table(name =Apartments)
public class Apartment extends AbstractEntity implements Comparable< {
private Integer id;
private String roomName;
private Double pricePerHour;
private ApartmentState apartmentState;
private StarRating评分;
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人);

private String count;

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

对我来说最好的方法是将enum作为枚举可能在MySql工作台)或作为字符串(并使用 name() valueOf()从Enum类)。



但是如何使用hibernate实现它。



如何解决这个问题?

解决方案

枚举,以指示您希望字符串表示形式被持久化:

  @Enumerated(EnumType.STRING)
private ApartmentState apartmentstate;


I tried to fill DB tables with random data and through Hibernate.

But my code fill incompatible data into tables (not exactly incompatible it is index of this element declared at enum, for ex: at ApartmentState - FREE is first element it set to appropriate column it index - 0. But I want to put or FREE as enum or as string).

I couldn't figure out why exactly this happen.

Here is code snippet:

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

I need to fill at table some enum values, as rating (2, 3, 4) and sleep places (1, 2..).

But this puts some wrong data into table.

Here is content at workbench:

Why it puts only index, not as string or as enum.
How can I recovering this at desired value, in the future.

Here is snippet from Apartment class:

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

For me the best is to put enum as enum (possibly at MySql workbench) or as a string (and use name() and valueOf() from Enum class).

But how to implement it with hibernate.

How to solve this trouble?

解决方案

You can add following enumeration, to indicate you want the String representation to be persisted :

@Enumerated(EnumType.STRING)
private ApartmentState apartmentState;

这篇关于如何使用Hibernate保存枚举值到DB?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆