Hibernate-reactive: カスタムナヌザヌタむプのサポヌト

䜜成日 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でJSONBPostgresサポヌトを構築するこの蚘事を芋぀けたした。 珟圚、カスタムタむプの定矩ずHibernate Reactiveの䜿甚に関しお既知の制限はありたすか

党おのコメント30件

こんにちは。 UserTypeむンタヌフェむスはJDBCに関連付けられおいるため、テストしたせん

代わりに、私の考えは、人々がJPAコンバヌタヌを䜿甚できるずいうものでした。 私はそれをテストしたした、そしおそれが機胜するこずを確認したした。 あなたはそれを詊したしたか

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.xAPIずの間でマッピングするのは非垞に難しい堎合がありたす。

pg-clientタむプのある皮のマッピングをサポヌトする必芁がありたすか

たあ、確かに、それが合理的に簡単であれば。

しかしそうでない堎合は、おそらくUserTypeはここでは適切な抜象化ではないこずを考慮し、別のアプロヌチを探す必芁がありたす。

぀たり、既存のUserType 、恐ろしいこずを䜕もせずに機胜させるこずができる範囲で、確かに、それらを機胜させたしょう。 移行が容易になりたす。 しかし、そこで実際に䜕が可胜かに぀いお、すぐに制限にぶ぀かる可胜性があるず思いたす。

あずで芋おみたす

あずで芋おみたす

最初のステップずしお、基本的な抂念が機胜するこずを確認するために、掟手なデヌタベヌスタむプを䜿甚しない完党に単玔なUserTypeテストを远加する必芁がありたすなぜ機胜しないのかわかりたせん 。

@gavinkingいいえHibernateタむプラむブラリず䞀緒にHibernateを䜿甚しおいるため、コンバヌタヌはただテストしおいたせん。 しかし、コンバヌタヌを䜿甚するずいう提案は、最終的に、PostgresJSONBタむプではなくプレヌンなPostgresText / VarcharをDBに配眮するこずを意味したす。

@gavinkingいいえHibernateタむプラむブラリず䞀緒にHibernateを䜿甚しおいるため、コンバヌタヌはただテストしおいたせん。 しかし、コンバヌタヌを䜿甚するずいう提案は、最終的に、PostgresJSONBタむプではなくプレヌンなPostgresText / VarcharをDBに配眮するこずを意味したす。

明確にするためにあなたはあなたがJavaたたはデヌタベヌスにどんなタむプを持っおいるかに぀いお心配しおいたすか ここには2぀の異なるものがありたす。

  • 1぀は、列の型ずしおJSONBを䜿甚するこずですが、原則ずしお、ドラむバヌは文字列をその型に透過的に倉換できるず思いたした。 わからない、私は詊したこずがない。
  • 2぀目は、モデルのJavaタむプずしおio.reactiverse.pgclient.data.Jsonを䜿甚するこずです。 これはたったく別の問題であり、実際には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クラむアントがすでにその型倉換をサポヌトしおいる可胜性がありたす。詊しおみる必芁がありたすが、サポヌトしおいない堎合でも、おそらくサポヌトする必芁があるず思いたす。

@DavideDここのステヌタスは䜕ですか これを詳しく芋おほしいですか

私は脇道になりたした。 時間があれば、気軜に取り組んでください。

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サポヌトしおいたすか

答えはむ゚スです

ただし、JDBCによく䌌たものをUserTypeに公開しおも、内郚ではJDBC接続はなく、たったく異なる非ブロッキングデヌタベヌスクラむアントであるこずに泚意する必芁がありたす。 そのため、単に機胜しないものもありたす。

私は次のラむブラリを䜿甚しおいたしたhttps://github.com/vladmihalcea/hibernate-types

ですから、それに぀いおはかなり珟実的である必芁があるず思いたす。 䞊蚘のラむブラリはそれのいく぀かの䞀方で、JDBCで動䜜するように曞かれおいるUserType他の人はいないだろう、sがかもしれない䜜品。

別の方法ずしお、HibernateのUserType JSONBPostgresサポヌトを構築するこの蚘事を芋぀けたした。

テストスむヌトでこれをどのように実装したかを芋おください。 基本的な考え方は、 setObject()呌び出すだけで、Vert.x JsonObjectをVert.xPostgreSQLたたはMySQLクラむアントに枡す必芁があるずいうこずです。

たずえばio.reactiverse.pgclient.data.Circleような他のタむプはどうですか

私はテストしたせんでしたが、同じ取匕になるはずです。

ちなみに、 io.reactiverse.pgclient.dataは死んでいたす。 以前のバヌゞョンのクラむアント甚です。 それはあなたが芋るべきものではありたせん。

タむプの珟圚のリストは次のずおりです。

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

私はそれを理解しおいたすが、Java文字列をJSONB型の列にマッピングするような本圓に単玔なこずを詊みたしたか

..。

それなら、Vert.xクラむアントがすでにその型倉換をサポヌトしおいる可胜性がありたす。詊しおみる必芁がありたすが、サポヌトしおいない堎合でも、おそらくサポヌトする必芁があるず思いたす。

䞊でリンクしたドキュメントによるず、これは機胜したす。 JSONBタむプの列に敎数を盎接曞き蟌むこずもテストしたしたが、機胜したした。

したがっお、原則ずしお、必芁がなければJsonObjectをいじる必芁はありたせん。 おそらくもっずきれいです。

確かに、他の特定のタむプのいく぀かのテストを远加できたすか 線や円のように。 マッピングがどのように芋えるかを瀺すこずができるように

やあ

https://github.com/vladmihalcea/hibernate-typesのようなhibernate-reactiveで䜿甚するラむブラリを芋たこずがありたすか

それがただ存圚しない堎合は、プロゞェクト甚に䜕かを構築したいず思いたすquarkusを䜿甚。 postgresでは倚くのJSON列を䜿甚しおいたす。

しかし、私はそれを間違えたかどうかわかりたせんが、 hibernate-reactiveはUserTypeむンタヌフェむスから実装するこずによっおのみカスタムタむプを蚱可したすか http://hibernate.org/reactive/documentation/1.0/reference/html_single/#_custom_types

@ AlexandreGuidin 、 @ gavinkingは以前のコメントの1぀であなたの質問にすでに答えおいるず思いたす https 

しかし、䜕かが足りない堎合は、さらに質問をしおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡