본문 바로가기

소프트웨어 이야기/프로그래밍 언어와 프레임워크

Hibernate-type-52 - Entity에 Postgresql Jsonb 타입 선언하기

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) 참고할 테스트 코드 위치

github.com/vladmihalcea/hibernate-types/tree/master/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json

TMI

JsonNodeBinaryType, JsonNodeStringType 차이점 

  • JsonNodeStringType : MySQL 전용
  • JsonNodeBinaryType : PostgreSQL 전용

참고