Skip to content

Latest commit

 

History

History
187 lines (138 loc) · 3.85 KB

jpa-json-column.md

File metadata and controls

187 lines (138 loc) · 3.85 KB

JPA에서 JSON Column 사용하기

One

Column

public class LanguageValue {

    private String value;
    private String locale;

    public LanguageValue() {
    }

    public LanguageValue(String value, String locale) {
        this.value = value;
        this.locale = locale;
    }

    ... getter, setter
}

Entity & Repository

@Entity
public class Human {

    @Id @GeneratedValue
    private long id;

    @Convert(converter = LanguageConverter.class)
    private LanguageValue name;

    public Human() {
    }

    public Human(LanguageValue name) {
        this.name = name;
    }
}

public interface HumanRepository extends JpaRepository<Human, Long> {
}

Converter

public class LanguageConverter implements AttributeConverter<LanguageValue, String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(LanguageValue attribute) {
        try {
            return objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public LanguageValue convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, LanguageValue.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

Result

one

List

Entity

@Entity
public class Human {

    @Id @GeneratedValue
    private long id;

    @Convert(converter = LanguageConverter.class)
    private List<LanguageValue> name;

    public Human() {
    }

    public Human(List<LanguageValue> name) {
        this.name = name;
    }
}

Converter

public class LanguageConverter implements AttributeConverter<List<LanguageValue>, String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(List<LanguageValue> attribute) {
        try {
            return objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<LanguageValue> convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, List.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

Result

list

Map

Entity

@Entity
public class Human {

    @Id
    @GeneratedValue
    private long id;

    @Convert(converter = LanguageConverter.class)
    private Map<String, String> name;

    public Human() {
    }

    public Human(Map<String, String> name) {
        this.name = name;
    }
}

Converter

public class LanguageConverter implements AttributeConverter<Map<String, String>, String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(Map<String, String> attribute) {
        try {
            return objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Map<String, String> convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, Map.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

Result

map