簡體   English   中英

如何使用 jpa 枚舉映射 Spring boot 為什么不在數據庫中保存枚舉值在數據庫中保存枚舉鍵

[英]How to enum mapping with jpa Spring boot why not save enum value in DB in DB saving enum key

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Version;

import org.hibernate.annotations.GenericGenerator;

import com.lue.billingsystem.enums.Status;
import com.lue.billingsystem.enums.Types;

@Entity
@Table(name="product_tab")
public class Product implements Serializable{

    private static final long serialVersionUID = 8919320309645697466L;

    @Id
    @Column(name="prod_id",updatable=false)
    @GenericGenerator(name="product_tab_genetator",strategy="increment")
    @GeneratedValue(generator="product_tab_genetator")
    private Long id;

    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name = "type")
    private Types type;

    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    private Status status;

    @Column(name = "description", length = 200)
    private String description;

    @OneToMany(mappedBy="product")
    private List<Charge> charges;


    @Column(name = "create_date", columnDefinition = "DATETIME")
    private Date createDate;

    @Column(name = "update_date", columnDefinition = "DATETIME")
    private Date updateDate;

    //@Version
    private Integer version;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Types getType() {
        return type;
    }
    public void setType(Types type) {
        this.type = type;
    }
    public Status getStatus() {
        return status;
    }
    public void setStatus(Status status) {
        this.status = status;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public List<Charge> getCharges() {
        return charges;
    }
    public void setCharges(List<Charge> charges) {
        this.charges = charges;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public Date getUpdateDate() {
        return updateDate;
    }
    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }
    public Integer getVersion() {
        return version;
    }
    public void setVersion(Integer version) {
        this.version = version;
    }


}





import org.springframework.http.HttpStatus;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.lue.billingsystem.enums.utils.StatusDeserializer;
import com.lue.billingsystem.exception.BillingException;

@JsonDeserialize(using = StatusDeserializer.class)
public enum Status {
    ACTIVE("Active"), INACTIVE("Inactive");

    private final String text;

    Status(final String text) {
        this.text = text;
    }

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

    public String getText() {
        return this.text;
    }

    public static Status fromText(String text) {
        for (Status r : Status.values()) {
            if (r.getText().equals(text)) {
                System.out.println(r);
                return r;
            }
        }
        throw new BillingException("Your Status not valied: "+text +" ", HttpStatus.BAD_REQUEST, 400);
    }

}


import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.lue.billingsystem.enums.Status;

public class StatusDeserializer extends JsonDeserializer<Status> {

    @Override
    public Status deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {

        ObjectCodec oc = jsonParser.getCodec();
        JsonNode node = oc.readTree(jsonParser);

        if (node == null) {
            return null;
        }

        String text = node.textValue(); // gives "A" from the request

        if (text == null) {
            return null;
        }
        //System.out.println(Status.fromText(text) + "---------------");
        return Status.fromText(text);
    }

}

如何使用 jpa 枚舉映射 Spring boot 為什么不在 DB 中保存枚舉值在 DB 中保存枚舉鍵,當我將產品保存在數據庫中時不保存狀態,如 Active 它總是保存 ACTIVE

您只需要在創建表時注意枚舉值。 表中的枚舉值是什么,例如在狀態列中,是定義為'Active', 'Inactive''ACTIVE', 'INACTIVE' 這將決定保存的價值。

如果枚舉值定義為'ACTIVE', 'INACTIVE' ,如果您插入 'active' 作為狀態值,它將在數據庫內更改為 'ACTIVE',因為它是根據預定義的枚舉值插入的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM