소프트웨어-이야기/프로그래밍 언어와 프레임워크
Hibernate-type-52 - Entity에 Postgresql Jsonb 타입 선언하기
americano_people
2020. 11. 21. 18:52
Note
Hibernate는 Postgresql의 Jsonb 타입을 지원하지 않는다. Jsonb 타입을 엔터티의 속성으로 적용하고 싶은 경우 hibernate-types-52 오픈 소스를 적용하거나, Hibernate의 UserType을 사용하여 커스텀한 Jsonb 타입을 구현해야한다.
Code
(1) 의존성 추가하기
dependencies {
compile('com.vladmihalcea:hibernate-types-52:2.10.0')
}
(2) Entity Class에 TypeDef 어노테이션 선언하기
(3) 프로퍼티에 jsonb Type, Column 어노테이션 선언하기
(4-1) 샘플 - JsonBinary 타입 선언하기
@Entity(name = "Event")
@Table(name = "event")
@TypeDef(name = "jsonb-node", typeClass = JsonBinaryType.class)
public static class Event {
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private Location location;
public Location getLocation() {
return location;
}
public void setLocation(Location location) {
this.location = location;
}
}
(4-2) 샘플 - JsonNodeBinary 타입 선언하기
@Entity(name = "Book")
@Table(name = "book")
@TypeDef(name = "jsonb-node", typeClass = JsonNodeBinaryType.class)
public static class Book {
@Id
@GeneratedValue
private Long id;
@NaturalId
private String isbn;
@Type(type = "jsonb-node")
@Column(columnDefinition = "jsonb")
private JsonNode properties;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public JsonNode getProperties() {
return properties;
}
public void setProperties(JsonNode properties) {
this.properties = properties;
}
}
(4-4) 참고할 테스트 코드 위치
TMI
JsonNodeBinaryType, JsonNodeStringType 차이점
- JsonNodeStringType : MySQL 전용
- JsonNodeBinaryType : PostgreSQL 전용
참고
- https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/
- JsonNodeBinaryType VS JsonNodeStringType
- https://thorben-janssen.com/persist-postgresqls-jsonb-data-type-hibernate/