在hibernate中持久化Object时,无法将枚举转换为String

时间:2014-02-23 03:42:04

标签: java string hibernate java-ee enums

我正在尝试将menuItem对象保留在数据库中。其中一个itemField是一个ItemType字符串,由ItemType枚举限定。这是我的MenuItem POJO。

public class MenuItemImpl implements MenuItem{

    private long id;

    private String itemName;

    private String itemType;

    private int itemPrice;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName= itemName;
    }

    public ItemType getItemType() {
        return ItemType.valueOf(itemType);
    }

    public void setItemType(ItemType itemType) {
        this.itemType=itemType.toString();
    }

    public int getItemPrice() {
        return this.itemPrice;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice=itemPrice;
    }

}

这是我的ItemType枚举

public enum ItemType {
    BURGER("BURGER"), BEVERAGE("BEVERAGE"), SNACK("SNACK"), TOY("TOY");

    private String value;

    private ItemType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return value;
    }
}

现在,当我尝试对此对象进行保存时。我得到以下异常:

    com.saggezza.ItemType cannot be cast to java.lang.String

我不明白为什么它甚至应该尝试投射ItemType。因为我在menuItem POJO中的getter和setter方法已经处理了enum到string和string到enum的转换。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

问题是Hibernate正在使用你的getter / setter访问你的属性,所以当它想要获得itemType字段的值来保存它时,它会调用getItemType(),期待它返回String(映射中的内容),然后会得到ItemType,因此是例外。

您可以查看this answer,了解如何直接将enum添加到地图中。

答案 1 :(得分:-1)

我注意到这个方法:

public void setItemType(ItemType itemType) {
    this.itemType=itemType.toString();
}

您具有指定为 itemType 的参数和具有相同名称的全局字符串变量 itemType ,以便更轻松地支持您的代码(并找出错误的位置)正在发生)我建议将参数重命名为 item 。像这样:

public void setItemType(ItemType item) {
    this.itemType=item.toString();
}

然后你总是知道项目指的是什么。