Hibernate-reactive: μ‚¬μš©μž μ •μ˜ UserType 지원

에 λ§Œλ“  2020λ…„ 07μ›” 09일  Β·  30μ½”λ©˜νŠΈ  Β·  좜처: hibernate/hibernate-reactive

μ•ˆλ…•ν•˜μ„Έμš”. Hibernate ReactiveλŠ” μ‚¬μš©μž μ •μ˜ UserType을 μ§€μ›ν•©λ‹ˆκΉŒ? Postgres JSONB Type을 μ‚¬μš©ν•˜κ³  μ‹Άκ³  Hibernate의 AbstractSingleColumnStandardBasicType 기반으둜 μ‚¬μš©μž μ •μ˜ μœ ν˜•μ„ λΉŒλ“œν•˜λŠ” λ‹€μŒ 라이브러리 https://github.com/vladmihalcea/hibernate-types λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ Hibernateμ—μ„œ Hibernate Reactive둜 μ΄λ™ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μ΄λŸ¬ν•œ μœ ν˜•μ„ μ‚¬μš©ν•˜λŠ” 열은 μ—”ν‹°ν‹°μ—μ„œ 항상 nullμž…λ‹ˆλ‹€. λŒ€μ•ˆμœΌλ‘œ Hibernate의 UserType 에 λŒ€ν•œ JSONB Postgres 지원을 κ΅¬μΆ•ν•˜λŠ” 이 기사 λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. ν˜„μž¬ μ‚¬μš©μž μ •μ˜ μœ ν˜•μ„ μ •μ˜ν•˜κ³  Hibernate Reactiveλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 κ΄€λ ¨ν•˜μ—¬ μ•Œλ €μ§„ μ œν•œ 사항이 μžˆμŠ΅λ‹ˆκΉŒ?

design

λͺ¨λ“  30 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”, ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ JDBC에 μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— UserType ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. (μ›μΉ™μ μœΌλ‘œλŠ” λŒ€λΆ€λΆ„ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.)

λŒ€μ‹  μ‚¬λžŒλ“€μ΄ JPA λ³€ν™˜κΈ°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것이 제 μƒκ°μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 ν…ŒμŠ€νŠΈν–ˆκ³  AFAIKκ°€ μž‘λ™ν•©λ‹ˆλ‹€. 당신은 그것을 μ‹œλ„ ν–ˆμŠ΅λ‹ˆκΉŒ?

UserType을 μ‚¬μš©ν•˜μ—¬ λΉ λ₯Έ ν…ŒμŠ€νŠΈλ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œ PgClientμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

UserType을 μ‚¬μš©ν•˜μ—¬ λΉ λ₯Έ ν…ŒμŠ€νŠΈλ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œ PgClientμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 그것은 우리의 κ°€μ§œ JDBC 계측이 λΆˆμ™„μ „ν•˜κΈ° λ•Œλ¬ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€. (일뢀 κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œ.)

λͺ…ν™•νžˆν•˜κΈ° μœ„ν•΄ vlad 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ 예제λ₯Ό μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

    @TypeDefs({
            @TypeDef(name = "json", typeClass = JsonStringType.class),
            @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
    })
    @Entity(name="GuineaPig")
    @Table(name="Pig")
    public static class GuineaPig {
        <strong i="6">@Id</strong>
        private Integer id;
        private String name;

        @Type(type = "jsonb")
        @Column(columnDefinition = "jsonb")
        private  Location location;

이것은 였λ₯˜μž…λ‹ˆλ‹€:

Caused by: io.vertx.core.impl.NoStackTraceThrowable: Parameter at position[0] with class = [com.fasterxml.jackson.databind.node.ObjectNode] and value = [{"country":"UK","city":"Gotham"}] can not be coerced to the expected class = [java.lang.Object] for encoding.

λ°˜μ‘ν˜• pg ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹€λ₯Έ μœ ν˜•μ„ μ‚¬μš©ν•˜μ—¬ JSON으둜 λ³€ν™˜ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

@gavinking pg-client μœ ν˜•μ— λŒ€ν•΄ μΌμ’…μ˜ 맀핑을 지원해야 ν•©λ‹ˆκΉŒ?

JSON (io.reactiverse.pgclient.data.Json)
JSONB (io.reactiverse.pgclient.data.Json)
POINT (io.reactiverse.pgclient.data.Point)
LINE (io.reactiverse.pgclient.data.Line)
LSEG (io.reactiverse.pgclient.data.LineSegment)
BOX (io.reactiverse.pgclient.data.Box)
PATH (io.reactiverse.pgclient.data.Path)
POLYGON (io.reactiverse.pgclient.data.Polygon)
CIRCLE (io.reactiverse.pgclient.data.Circle)

ν΄λΌμ΄μ–ΈνŠΈκ°€ io.reactiverse.pgclient.data.Json μœ ν˜•μ˜ 개체λ₯Ό κΈ°λŒ€ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·Έλž˜λ„ UserType μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ°”λ‘œ μœ„μ˜ λ‚΄ λŒ“κΈ€μ—μ„œ λ‚΄κ°€ μ˜λ―Έν•œ λ°”μž…λ‹ˆλ‹€. 우리의 JDBC μ–΄λŒ‘ν„°λŠ” JDBC의 μ™„μ „ν•œ κ΅¬ν˜„μ— 가깝지도 μ•ŠμœΌλ©°, λ‚˜λŠ” 그듀이 κ²°μ½” 그렇지 μ•Šμ„ κ°€λŠ₯성이 맀우 λ†’λ‹€κ³  λ΄…λ‹ˆλ‹€. 특히 "이ꡭ적인" JDBC μœ ν˜•μ˜ 경우 이λ₯Ό Vert.x API와 λ§€ν•‘ν•˜λŠ” 것이 μƒλ‹Ήνžˆ μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

pg-client μœ ν˜•μ— λŒ€ν•΄ μΌμ’…μ˜ 맀핑을 지원해야 ν•©λ‹ˆκΉŒ?

κΈ€μŽ„μš”, λ§Œμ•½ 그것이 ν•©λ¦¬μ μœΌλ‘œ μ‰¬μš΄ 일이라면 말이죠.

κ·ΈλŸ¬λ‚˜ 그렇지 μ•Šλ‹€λ©΄ μ•„λ§ˆλ„ UserType κ°€ μ—¬κΈ°μ—μ„œ μ˜¬λ°”λ₯Έ 좔상화가 μ•„λ‹ˆλΌλŠ” 점을 κ³ λ €ν•˜κ³  λ‹€λ₯Έ μ ‘κ·Ό 방식을 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€.

λ‚΄ 말은, 기쑴의 UserType λ”μ°ν•œ 일을 ν•˜μ§€ μ•Šκ³  μž‘λ™ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆμ„ μ •λ„λ‘œλ§Œ μž‘λ™ν•˜λ„λ‘ ν•©μ‹œλ‹€. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ 더 μ‰¬μ›Œμ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μš°λ¦¬κ°€ κ·Έκ³³μ—μ„œ μ‹€μ œλ‘œ κ°€λŠ₯ν•œ 것에 λŒ€ν•œ ν•œκ³„μ— 빨리 λΆ€λ”ͺ힐 κ°€λŠ₯성이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚΄κ°€ λ΄μ€„κ²Œ

λ‚΄κ°€ λ΄μ€„κ²Œ

첫 번째 λ‹¨κ³„λ‘œ κΈ°λ³Έ κ°œλ…μ΄ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ 멋진 λ°μ΄ν„°λ² μ΄μŠ€ μœ ν˜•μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ™„μ „νžˆ ν‰λ²”ν•œ UserType 에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. ).

@gavinking μ•„λ‹ˆμš” Hibernate Types λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ»˜ Hibernateλ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 아직 Converterλ₯Ό ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³€ν™˜κΈ°λ₯Ό μ‚¬μš©ν•˜λΌλŠ” μ œμ•ˆμ€ κ²°κ΅­ 일반 Postgres Text/Varcharλ₯Ό Postgres JSONB μœ ν˜•μ΄ μ•„λ‹Œ DB에 넣을 κ²ƒμž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

@gavinking μ•„λ‹ˆμš” Hibernate Types λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ»˜ Hibernateλ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 아직 Converterλ₯Ό ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³€ν™˜κΈ°λ₯Ό μ‚¬μš©ν•˜λΌλŠ” μ œμ•ˆμ€ κ²°κ΅­ 일반 Postgres Text/Varcharλ₯Ό Postgres JSONB μœ ν˜•μ΄ μ•„λ‹Œ DB에 넣을 κ²ƒμž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

λͺ…ν™•νžˆ ν•˜κΈ° μœ„ν•΄: Java λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— μ–΄λ–€ μœ ν˜•μ΄ μžˆλŠ”μ§€ μš°λ €ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? μ—¬κΈ°μ—λŠ” 두 가지 λ‹€λ₯Έ 점이 μžˆμŠ΅λ‹ˆλ‹€.

  • ν•˜λ‚˜λŠ” μ—΄ μœ ν˜•μœΌλ‘œ JSONB λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ§€λ§Œ μ›μΉ™μ μœΌλ‘œ λ“œλΌμ΄λ²„κ°€ λ¬Έμžμ—΄μ„ ν•΄λ‹Ή μœ ν˜•μœΌλ‘œ 투λͺ…ν•˜κ²Œ λ³€ν™˜ν•  수 μžˆλ‹€κ³  μƒκ°ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. (ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹œλ„ν•œ 적이 μ—†μŠ΅λ‹ˆλ‹€.)
  • 두 λ²ˆμ§ΈλŠ” io.reactiverse.pgclient.data.Json λ₯Ό λͺ¨λΈμ˜ Java μœ ν˜•μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 그것은 μ™„μ „νžˆ λ‹€λ₯Έ 문제이며 μ‹€μ œλ‘œ UserType 와 같은 것이 ν•„μš”ν•©λ‹ˆλ‹€.

@gavinking
Postgres JSONB μœ ν˜•μ„ μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. Hibernateμ—μ„œ 직접 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이것이 λ‚΄κ°€ https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/ 에 μ˜μ‘΄ν•œ μ΄μœ μž…λ‹ˆλ‹€. λ˜λŠ” 예λ₯Ό λ“€μ–΄ https://thorben-janssen.com/persist-postgresqls-jsonb-data-type-hibernate/ μ—¬κΈ°μ—μ„œ κ°€μ΄λ“œλŠ” UserType 을 μ‚¬μš©ν•©λ‹ˆλ‹€.

λ§žμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Java String λ₯Ό JSONB μœ ν˜•μ˜ 열에 λ§€ν•‘ν•˜λŠ” 것과 같이 정말 κ°„λ‹¨ν•œ μž‘μ—…μ„ μ‹œλ„ν•΄ λ³΄μ…¨μŠ΅λ‹ˆκΉŒ? νš¨κ³Όκ°€ μžˆλ‹€λ©΄ μΆ©λΆ„νžˆ μ’‹κ² μ£ ?

@gavinking μ•„λ‹ˆμš” 아직 μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 예, μΆ©λΆ„νžˆ 쒋을 κ²ƒμž…λ‹ˆλ‹€. λ‚΄ μ—”ν‹°ν‹°λ₯Ό DB에 μ‚½μž…ν•˜κΈ° 전에 JSON 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ Vert.x ν΄λΌμ΄μ–ΈνŠΈκ°€ 이미 ν•΄λ‹Ή μœ ν˜• λ³€ν™˜μ„ μ§€μ›ν•˜λŠ” 것일 수 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” μ‹œλ„ν•΄μ•Ό ν•˜μ§€λ§Œ μ§€μ›ν•˜μ§€ μ•Šλ”λΌλ„ μ•„λ§ˆλ„ κ·Έλž˜μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@DavidD μ—¬κΈ° μƒνƒœκ°€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ? 이 뢀뢄을 μžμ„Ένžˆ μ‚΄νŽ΄λ³ΌκΉŒμš”?

λ‚˜λŠ” 길을 μžƒμ—ˆλ‹€. μ‹œκ°„μ΄ 있으면 이 문제λ₯Ό ν•΄κ²°ν•˜μ‹­μ‹œμ˜€.

#301μ—μ„œ UserType κ°€ HRμ—μ„œ μž‘λ™ν•œλ‹€λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. μ΅œμ†Œν•œ PreparedStatement 및 ResultSet μ–΄λŒ‘ν„°κ°€ JDBC( 특히 큰 λ²”μœ„λŠ” μ•„λ‹™λ‹ˆλ‹€).

@gavinking pg-client μœ ν˜•μ— λŒ€ν•΄ μΌμ’…μ˜ 맀핑을 지원해야 ν•©λ‹ˆκΉŒ?

JSON (io.reactiverse.pgclient.data.Json)
JSONB (io.reactiverse.pgclient.data.Json)
POINT (io.reactiverse.pgclient.data.Point)
LINE (io.reactiverse.pgclient.data.Line)
LSEG (io.reactiverse.pgclient.data.LineSegment)
BOX (io.reactiverse.pgclient.data.Box)
PATH (io.reactiverse.pgclient.data.Path)
POLYGON (io.reactiverse.pgclient.data.Polygon)
CIRCLE (io.reactiverse.pgclient.data.Circle)

이제 μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. PostgreSQL ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•œ κ°•λ ₯ν•œ 쒅속성을 μƒμ„±ν•˜μ§€ μ•Šκ³  JDBC μ–΄λŒ‘ν„°μ—μ„œ getObject() 및 setObject() κ°€ μ΄λŸ¬ν•œ μœ ν˜•μ„ μ§€μ›ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‹€μŒκ³Ό 같은 것이 κ°€λŠ₯ν•©λ‹ˆκΉŒ?

@Type(type="passthrough")
Circle circle

λ³€ν™˜μ„ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  값을 μžˆλŠ” κ·ΈλŒ€λ‘œ μ „λ‹¬ν•©λ‹ˆκΉŒ?

이제 μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. PostgreSQL ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•œ κ°•λ ₯ν•œ 쒅속성을 μƒμ„±ν•˜μ§€ μ•Šκ³  JDBC μ–΄λŒ‘ν„°μ—μ„œ getObject() 및 setObject() λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆκΉŒ?

κΈ€μŽ„, λ‚˜λŠ” 이것을 μ‹œλ„ν–ˆκ³  λΆ„λͺ…νžˆ Postgres λ˜λŠ” MySQLμ—μ„œ io.vertx.core.json.JsonObject λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‹€μ œλ‘œ νŠΉλ³„ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 당신은 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ getObject() / setObject() λ‹Ήμ‹ μ—μ„œ UserType .

이것은 μž‘λ™ν•©λ‹ˆλ‹€:

public class Json implements UserType {

    <strong i="15">@Override</strong>
    public int[] sqlTypes() {
        return new int[] {Types.OTHER};
    }

    <strong i="16">@Override</strong>
    public Class returnedClass() {
        return JsonObject.class;
    }

    <strong i="17">@Override</strong>
    public boolean equals(Object x, Object y) throws HibernateException {
        return Objects.equals(x,y);
    }

    <strong i="18">@Override</strong>
    public int hashCode(Object x) throws HibernateException {
        return Objects.hashCode(x);
    }

    <strong i="19">@Override</strong>
    public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
        return rs.getObject(names[0]);
    }

    <strong i="20">@Override</strong>
    public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
        if (value==null) {
            st.setNull(index, Types.OTHER);
        }
        else {
            st.setObject(index, value);
        }
    }

    ...
}

λ‹€μŒκ³Ό 같은 것이 κ°€λŠ₯ν•©λ‹ˆκΉŒ?

@Type(type="passthrough")
Circle circle

λ³€ν™˜μ„ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  값을 μžˆλŠ” κ·ΈλŒ€λ‘œ μ „λ‹¬ν•©λ‹ˆκΉŒ?

예, 그것도 μž‘λ™ν•©λ‹ˆλ‹€.

54434c94b3ff57261fd905abaeb25961b2ed285cλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

이 문제λ₯Ό μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ io.reactiverse.pgclient.data.Circle 와 같은 λ‹€λ₯Έ μœ ν˜•μ€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

@akoufaλŠ” 이제 μ›λž˜ μ§ˆλ¬Έμ— λŒ€ν•œ ꡬ체적인 닡변을 μ œκ³΅ν•©λ‹ˆλ‹€.

Hibernate ReactiveλŠ” μ‚¬μš©μž μ •μ˜ UserTypes ν•©λ‹ˆκΉŒ?

λŒ€λ‹΅μ€ μ˜ˆμž…λ‹ˆλ‹€!

κ·ΈλŸ¬λ‚˜ μš°λ¦¬κ°€ UserType JDBC 와 맀우 μœ μ‚¬ν•œ 것을 λ…ΈμΆœν•˜λ”λΌλ„ μ€λ°€νžˆ JDBC 연결이 μ—†κ³  μ™„μ „νžˆ λ‹€λ₯Έ 비차단 λ°μ΄ν„°λ² μ΄μŠ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μžˆμŒμ„ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μ–΄λ–€ 것듀은 λ‹¨μˆœνžˆ μž‘λ™ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” λ‹€μŒ 라이브러리λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ‹€ https://github.com/vladmihalcea/hibernate-types

κ·Έλž˜μ„œ λ‚˜λŠ” 당신이 그것에 λŒ€ν•΄ κ½€ ν˜„μ‹€μ μΌ ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μœ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” JDBC와 ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ μž‘μ„±λ˜μ—ˆμœΌλ―€λ‘œ UserType 쀑 일뢀 λŠ” μž‘λ™ν•  수 μžˆμ§€λ§Œ

λŒ€μ•ˆμœΌλ‘œ Hibernate의 UserType 에 λŒ€ν•œ JSONB Postgres 지원을 λΉŒλ“œν•˜λŠ” 이 기사λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈμ—μ„œ 이것을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν–ˆλŠ”μ§€ μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€. 기본적인 μ•„μ΄λ””μ–΄λŠ” 당신이 Vert.x ν†΅κ³Όν•΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ JsonObject λ°”λ‘œ ν˜ΈμΆœν•˜μ—¬ Vert.x의 PostgreSQL λ˜λŠ” MySQL의 ν΄λΌμ΄μ–ΈνŠΈμ— setObject() .

예λ₯Ό λ“€μ–΄ io.reactiverse.pgclient.data.Circle 와 같은 λ‹€λ₯Έ μœ ν˜•μ€ μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μ§€λ§Œ λ™μΌν•œ κ±°λž˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

그런데 io.reactiverse.pgclient.data 이(κ°€) μ£½μ—ˆμŠ΅λ‹ˆλ‹€. 이전 λ²„μ „μ˜ ν΄λΌμ΄μ–ΈνŠΈμš©μž…λ‹ˆλ‹€. 그것은 당신이보고해야 ν•  것이 μ•„λ‹™λ‹ˆλ‹€.

ν˜„μž¬ μœ ν˜• λͺ©λ‘μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

https://vertx.io/docs/vertx-pg-client/java/#_postgresql_type_mapping

μ΄ν•΄ν•˜μ§€λ§Œ Java String을 JSONB μœ ν˜•μ˜ 열에 λ§€ν•‘ν•˜λŠ” 것과 같이 정말 κ°„λ‹¨ν•œ μž‘μ—…μ„ μ‹œλ„ν•œ 적이 μžˆμŠ΅λ‹ˆκΉŒ?

...

κ·Έλ ‡λ‹€λ©΄ Vert.x ν΄λΌμ΄μ–ΈνŠΈκ°€ 이미 ν•΄λ‹Ή μœ ν˜• λ³€ν™˜μ„ μ§€μ›ν•˜λŠ” 것일 수 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” μ‹œλ„ν•΄μ•Ό ν•˜μ§€λ§Œ μ§€μ›ν•˜μ§€ μ•Šλ”λΌλ„ μ•„λ§ˆλ„ κ·Έλž˜μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μœ„μ— 링크 된 λ¬Έμ„œμ— λ”°λ₯΄λ©΄ 이것이 μž‘λ™ ν•©λ‹ˆλ‹€. JSONB -types 열에 직접 μ •μˆ˜λ₯Ό μ“°λŠ” 것도 ν…ŒμŠ€νŠΈν–ˆλŠ”λ° μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μ›μΉ™μ μœΌλ‘œ μ›ν•˜μ§€ μ•ŠλŠ” 경우 JsonObject 둜 엉망이 될 ν•„μš”μ‘°μ°¨ μ—†μŠ΅λ‹ˆλ‹€. (μ•„λ§ˆλ„ 더 깨끗할 κ²ƒμž…λ‹ˆλ‹€.)

λ¬Όλ‘ μž…λ‹ˆλ‹€. λ‹€λ₯Έ νŠΉμ • μœ ν˜•μ— λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μ„ μ΄λ‚˜ μ›μ²˜λŸΌ. 맀핑이 μ–΄λ–»κ²Œ μƒκ²ΌλŠ”μ§€ 보여쀄 수 μžˆλ„λ‘

μ•ˆλ…•ν•˜μ„Έμš”!

μ—¬λŸ¬λΆ„μ€ hibernate-reactive와 ν•¨κ»˜ μ‚¬μš©ν•  https://github.com/vladmihalcea/hibernate-types 와 같은 라이브러리λ₯Ό λ³Έ 적이 μžˆμŠ΅λ‹ˆκΉŒ?

아직 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λ‚΄ ν”„λ‘œμ νŠΈλ₯Ό μœ„ν•΄ 무언가λ₯Ό λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€(quarkus μ‚¬μš©). Postgresμ—μ„œ λ§Žμ€ JSON 열을 μ‚¬μš©ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ‚΄κ°€ 잘λͺ» μ΄ν•΄ν–ˆλŠ”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ hibernate-reactive λŠ” UserType μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©μž μ •μ˜ μœ ν˜•λ§Œ ν—ˆμš©ν•©λ‹ˆκΉŒ? (http://hibernate.org/reactive/documentation/1.0/reference/html_single/#_custom_types)

@AlexandreGuidin , λ‚˜λŠ” @gavinking이 이미 이전 λŒ“κΈ€ 쀑 ν•˜λ‚˜μ—μ„œ κ·€ν•˜μ˜ μ§ˆλ¬Έμ— λ‹΅λ³€ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€: https://github.com/hibernate/hibernate-reactive/issues/279#issuecomment -666289449

ν•˜μ§€λ§Œ μ œκ°€ λ†“μΉ˜κ³  μžˆλŠ” 뢀뢄이 μžˆλ‹€λ©΄ λͺ‡ 가지 μΆ”κ°€ μ§ˆλ¬Έμ„ λ‚¨κ²¨μ£Όμ„Έμš”.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰