Mysql 은 버전 5.7 이상부터 type 으로 Json 을 지원합니다.
RDBMS 의 목적과 반대되는 type 이라 많이 사용하진 않지만, 가끔 사용 할때가 있습니다.
이때 JPA 에서 Json 타입을 어떻게 선언하는지 hibernate 6 이상, 이하로 나누어 살펴보겠습니다.
@Entity
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class Entity {
@Column(name = "db_filed", columnDefinition = "json")
@Type(type = "json")
private List<String> imageUrl;
}
@TypeDef
pakage-info.java
파일에 적어서 패키지 레벨로도 사용 가능.
@TypeDefs({
@TypeDef(name = "json", typeClass = JsonStringType.class),
// 다른 공통 타입 정의들...
})
package com.example.user;
@Type
@Entity
public class Entity {
@Column(name = "db_filed", columnDefinition = "json")
@JdbcTypeCode(SqlTypes.JSON)
private List<String> imageUrl;
}
Compositional basic mapping 중 JdbcType에 해당되는 어노테이션 사용.
Compositional basic mapping 설명
하이버네이트는 명시적으로 해당 어노테이션이 붙어 있는 경우에만 Json 을 사용한다.
직렬화/역직렬화에 사용되는 JSON 라이브러리는 자동으로 감지되지만, hibernate.type.json_format_mapper를 설정하여 재정의할 수 있음.
하이버네이트에서 제공 하는 예시
해당 버전부터 deprecated 되어 사용 불가
- @TypeDef
- @TypeDefs
위 어노테이션이 deprecated 되어 사용자 정의 타입을 정의하는 방식도 변경.
-> MetadataContributor 인터페이스를 구현하는 방식으로 사용자 정의 타입을 등록.
JPA 2.1 이상을 사용하는 경우 AttributeConverter를 사용.
@Convert(converter = ListConverter.class)
private List<String> imageUrl;
AttributeConverter 를 구현한 컨버터를 등록해서 직렬화, 역직렬화를 직접 구현.
hibernate 6 이상 부터는 @TypeDef
를 쓸 수 없기 때문에 제공 되었던 UserType 들은 Compositional basic mapping 로 대체하고, AttributeConverter
를 사용하라고 권고한다.
@Type
은 복잡한 매핑을 가능하게 하지만 간단한 경우는 위 두가지 경우로 대체 가능하다.
ref
https://www.baeldung.com/hibernate-persist-json-object
https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html
https://prateek-ashtikar512.medium.com/how-to-handle-json-in-mysql-4adaeeb1d42f