spring jpa之實體屬性類型轉換器AttributeConverter

一、介紹接口AttributeConverter<x, y>

此接口用於轉化實體屬性的,但id屬性和關係屬性不可用。它有兩個方法:java

一、y convertToDatabaseColumn(x)  做用:將實體屬性x轉化爲y存儲到數據庫中,即插入和更新操做時執行;數據庫

二、x convertToEntityAttribute(y)  做用:將數據庫中的字段y轉化爲實體屬性x,即查詢操做時執行ide

二、實現的demo

需求:某數據庫表中的狀態列,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"
}
相關文章
相關標籤/搜索