我正在尝试将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的转换。
有什么想法吗?
答案 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();
}
然后你总是知道项目指的是什么。