hibernate 列舉的應用,註解之@Enumerated:針對列舉enum
阿新 • • 發佈:2019-01-31
廢話不多說。
程式碼:
package com.allk.entity.hotproductcfg; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import com.allk.entity.common.IdEntity; /** * * @ClassName: HotProductCfg * @Description: 熱門產品配置(包含熱門商家,熱門分類,熱門職位,配置) * @author brianyang * @date 2017年9月26日 上午9:40:45 * */ @Entity public class HotProductCfg extends IdEntity { /** * @Fields serialVersionUID : TODO(用一句話描述這個變量表示什麼) */ private static final long serialVersionUID = 1L; private Integer itemType;// 八大分類 private HotTypeEnum hotType;// 分類下面可以包含具體分類,比如,兼職,全職,租房,買房等等 private String name;// 名稱 private String url;// 連結地址 private Date createTime;// 建立時間 private Date updateTime;// 更新時間 public Integer getItemType() { return itemType; } public void setItemType(Integer itemType) { this.itemType = itemType; } @Enumerated(EnumType.ORDINAL) @Column(nullable=false) public HotTypeEnum getHotType() { return hotType; } public void setHotType(HotTypeEnum hotType) { this.hotType = hotType; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
package com.allk.entity.hotproductcfg; /** * @Author Darren * @Time 2017年9月26日 下午2:51:21 * @Description:熱門分類 */ public enum HotTypeEnum { PART_TIME(8, "兼職", "PARTTIME"), FULL_TIME(8, "全職", "FULLTIME"), USED_CAR(4, "二手車", "USEDCAR"), NEW_CAR(4, "新車","NEWCAR"); private Integer categoryId; private String typeName; private String code; private HotTypeEnum(Integer categoryId, String typeName, String code) { this.categoryId = categoryId; this.typeName = typeName; this.code = code; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
HotProductCfg類中
private HotTypeEnum hotType 此型別是一個列舉。
使用的@Enumerated(EnumType.ORDINAL)
資料庫生成的就是列舉的索引值,從0開始
如果使用@Enumerated(EnumType.STRING)
資料庫生成的就是實際的值
hotType列生成的就是實際的值
PART_TIME
FULL_TIME
就不是0或者1....了
那該如何抉擇?
如果使用STRING儲存,雖然從資料庫中查詢資料時非常直觀,能夠清楚的看出該型別代表意義,但這樣也會帶來其他的問題。若此時列舉型別的定義改變,
例如上例中的列舉型別名稱改為:
public enum HotTypeEnum {
PARTTIME(8, "兼職", "PARTTIME"), FULLTIME(8, "全職", "FULLTIME"), USEDCAR(4, "二手車", "USEDCAR"), NEWCAR(4, "新車","NEWCAR");
......................getter/setter等省略.
}
則此時資料庫中儲存的“PART_TIME”的值將不能轉化為列舉型別PARTTIME的值。但若使用ORDINAL則不會帶來這種問題。
所以建議使用ORDINAL型別來持久化列舉型別。