此接口用於轉化實體屬性的,但id屬性和關係屬性不可用。它有兩個方法:java
一、y convertToDatabaseColumn(x) 做用:將實體屬性x轉化爲y存儲到數據庫中,即插入和更新操做時執行;數據庫
二、x convertToEntityAttribute(y) 做用:將數據庫中的字段y轉化爲實體屬性x,即查詢操做時執行ide
需求:某數據庫表中的狀態列,1表示「啓用」,-1表示「禁用」,-2表示「已刪除」。
this
步驟一:建立StatusEnum,僅列出部分關鍵代碼
編碼
public enum StatusEnum { ENABLE(1, "啓用"), DISABLE(-1, "禁用"), DELETED(-2, "已刪除"); StatusEnum(Integer value, String description) { this.value = value; this.description = description; } }
步驟二:實現AttributeConverter<String, Integer>接口,將表明數字與描述進行轉換,其中實體類中的status字段爲String類型spa
public class StatusAttributeConverter implements AttributeConverter<String, Integer> { @Override public Integer convertToDatabaseColumn(String status) { try { return Integer.parseInt(status); //若是是數字,則直接返回(這裏能夠遍歷StatusEnum的value來進一步驗證) } catch (NumberFormatException e) { for (StatusEnum type : StatusEnum.values()) { //若是不是數字,則經過StatusEnum來找到描述對應的數字 if (status.equals(type.getDescription())) { return type.getValue(); } } } throw new RuntimeException("Unknown StatusEnum: " + status); //若是StatusEnum裏不存在表明數字或描述,則拋出異常 } @Override public String convertToEntityAttribute(Integer value) { for (StatusEnum type : StatusEnum.values()) { //將數字轉換爲描述 if (value.equals(type.getValue())) { return type.getDescription(); } } throw new RuntimeException("Unknown database value: " + value); } }
步驟三:看下實體類
.net
@Entity @Table(name = "t_demo") public class DemoEntity { @Convert(converter = StatusAttributeConverter.class) private String status; //狀態:1 啓用,-1 禁用,-2 已刪除 }
客戶端沒必要再硬編碼後臺的數字與描述的對應細節。
code
服務端提供獲取StatusEnum的接口,獲取到[{"value":1, "description":"啓用"}, {"value":-1, "description":"禁用"}, {"value":-2, "description":"已刪除"}],客戶端直接組裝成下拉列表便可。orm
copyright = { "做者": "墨衣夜行", "本文連接": "http://my.oschina.net/letao/blog/524487" }