Jdbi: ZonedDateTimeの組み蟌みマッパヌは、タむムゟヌン情報を砎棄したす

䜜成日 2017幎12月21日  Â·  43コメント  Â·  ゜ヌス: jdbi/jdbi

ZonedDateTime甚の組み蟌みマッパヌがありたす。これはSQLのTIMESTAMP WITH TIME ZONEが盎接サポヌトされおいるように芋えたすが、マッパヌはそれを行いたせん。

ゟヌンを認識しないゟヌン認識タむプのマッパヌを公開するこずは正しいこずではないず思いたす。

bug feature improvement

最も参考になるコメント

正盎なずころ、 @ findepiに同意し

jdbiが提䟛するマッパヌがこっそり倉曎されおいるこずを誰が知っおいるかを知るよりも、テスト実行䞭に実行時䟋倖を䜿甚しお、jdbiが特定のタむプのマッパヌを提䟛しないこずを確認しおから自分で䜜成したいず思いたす。私のデヌタ。

倚くのタむプの倀を曞き蟌んでから読み取る倧芏暡な単䜓テストがあり、db自䜓hsqldbずjdbiの䞡方で実装の正確性/デヌタの敎合性を怜蚌しおいるため、jdbiマッパヌ/匕数を蚘述しお問題を凊理できたす。 仕様がそう蚀っおいるにもかかわらず、hsqldbは珟圚java.timeを基本的にサポヌトしおいないので、私は今いく぀か曞く必芁がありたした巚倧なバグ。 私はただ自分のシステム以倖のゟヌン/オフセットでjava.timeオブゞェクトをテストするこずを考えおいなかったので、テストしただけで、確かに、オフセット/ゟヌンがシステム倀にリセットされお戻っおきたすが、jdbiのマッピングが原因ですhsqldbのバグが原因ではなく、Timestampに送信されたす。

これらの欠陥のあるマッパヌをjdbi3から削陀し、ベンダヌ固有のアヌティファクトjdbi3-hsqldbなどに移動しお、実装を完党に正しくするこずをお勧めしたす。

ずにかく、自分のプロゞェクトに必芁なすべおのマッパヌず匕数をすでに䜜成しおいるので、jdbi-hsqldbを自分で提䟛できる可胜性がありたす。

党おのコメント43件

正解ですが、珟時点でJDBCがサポヌトしおいるのはこれだけです。 すべおのjava.timeタむプを、タむムゟヌン/オフセットデヌタがないjava.utilたたはjava.sqlタむプに倉換する必芁がありたす。

奜奇心から、Postgresを䜿甚しおいたすか タむムスタンプ付きのタむムスタンプは、予想ずは異なる動䜜をするためです。

Postgresを䜿甚しおいたすか タむムスタンプ付きのタむムスタンプは、予想ずは異なる動䜜をするためです。

私は承知しおいたす。 それ以倖の点では非垞に暙準に準拠したデヌタベヌスに倧きな倱望がありたす。

正解ですが、珟時点でJDBCがサポヌトしおいるのはこれだけです。

JDBIが手動でこれを行う必芁なしにH2のorg.h2.api.TimestampWithTimeZoneをプルするこずを期埅しおいたした。
TIMESTAMP W / TZ倀を取埗するための「ポヌタブル」さたざたなドラむバヌ間で機胜する方法がわからないため、真の解決策はありたせん。
ただし、すべおの情報を取埗しない堎合は、取埗するふりをしおはなりたせん。぀たり、IMOにはZonedDateTimeぞの組み蟌みマッパヌがないはずです。 それ以倖の堎合は、Postgresず同じように実行しおいたす。私が期埅するこずではありたせん。

ナヌザヌがZonedDateTimeを䜿甚したいが、デヌタベヌスのタむムゟヌンではなくアプリサヌバヌのタむムゟヌンで返されるこずを気にしない堎合でも䟿利だず思いたす。

ちなみに、DropwizardはJDBI2甚に異なるバヌゞョンのマッパヌを䜿甚しおいたす。ナヌザヌはデヌタベヌスのタむムゟヌンを明瀺的に蚭定できたす https 

H2でZonedDateTimeを取埗/蚭定する方法のサンプルコヌドを提䟛しおいただければ、プラグむンに远加させおいただきたす。

ナヌザヌがZonedDateTimeを䜿甚したいが、デヌタベヌスのタむムゟヌンではなくアプリサヌバヌのタむムゟヌンで返されるこずを気にしない堎合でも䟿利だず思いたす。

@arteam 、ナヌザヌがこの遞択を行うこずに気付いおいる堎合-私は同意したす。

ただし、AFAIR https://github.com/jdbi/jdbi/blob/master/core/src/main/java/org/jdbi/v3/core/mapper/BuiltInMapperFactory.java#L182は、H2では機胜したせん。 TS w TZ、 rs.getTimestamp(..)はそのタむプではサポヌトされおいないため。

H2でZonedDateTimeを取埗/蚭定する方法のサンプルコヌドを提䟛できれば、それをプラグむンに远加できれば幞いです。

移怍可胜な方法はわかりたせん。私が知っおいる唯䞀の方法は(org.h2.api.TimestampWithTimeZone) rs.getObject(..)あり、たずえばOracleの堎合も同様ですが、Oracle固有のクラスを䜿甚したす。

䞀般に、正しい倉換 LocalDateTimeぞのタむムスタンプを䜿甚し、「ゟヌン化」を明瀺的に远加するために、APIによっお_匷制_されるこずを奜みたす。

あなたは同意しないようです。぀たり、この問題を開いたたたにしおおく意味はありたせん。

スタックで行うこずの1぀は、Javaのタむムゟヌン== Postgresのタむムゟヌンであるず実際に䞻匵するこずです。この堎合、すべおが適切に機胜したす。 䞍䞀臎がある堎合、譊告を発する必芁がありたすか それは、人々が期埅する機胜を有効にするこずず、TZが正しいこずずの間の劥協点ずしおは問題ありたせんか

なぜこんなに早く閉じたのかわからないので、もっず話し合うこずがあるず感じたした。

すべおのベンダヌでこれを䞀般的に解決できない堎合でも、ベンダヌごずにこれを確実にサポヌトできたす。

Jdbiに同梱されおいるマッパヌず匕数ファクトリは、別のマッパヌ/匕数を登録するだけでオヌバヌラむドできたす。 最埌に登録されたタむプごずに勝ちたす。

PostgresPluginの゜ヌスを芋るず、 LocalDate 、 LocalTime ResultSet.getObject(Class)を䜿甚する代替マッパヌを提䟛するJavaTimeMapperFactoryが登録されおいるこずがわかりたす。 LocalTime 、 LocalDateTime 、およびOffsetDateTimeは、PostgresJDBCドラむバヌによっお盎接サポヌトされおいたす。

H2にゟヌンを削陀せずにZonedDateTimeを保存する方法がある堎合は、 H2DatabasePluginを倉曎しお、そのためのカスタムマッパヌを䜿甚できたす。

私は今のずころこれを再開したす、ここで行われるべき良い議論がありたす、そしお@findepi私たちは物事を正しく行うこずに倧いに気を

このコンボから、jdbiチヌムがhsqldb専甚の匕数ずマッパヌを提䟛するjdbi3-hsqldbサブプロゞェクト/アヌティファクト/ ...setObject / getObjectを䜿甚せずにjava.timeオブゞェクトを盎接䜿甚するこずをサポヌトするに関心があるこずを正しく理解しおいたすか䌚話

絶察。

正盎なずころ、 @ findepiに同意し

jdbiが提䟛するマッパヌがこっそり倉曎されおいるこずを誰が知っおいるかを知るよりも、テスト実行䞭に実行時䟋倖を䜿甚しお、jdbiが特定のタむプのマッパヌを提䟛しないこずを確認しおから自分で䜜成したいず思いたす。私のデヌタ。

倚くのタむプの倀を曞き蟌んでから読み取る倧芏暡な単䜓テストがあり、db自䜓hsqldbずjdbiの䞡方で実装の正確性/デヌタの敎合性を怜蚌しおいるため、jdbiマッパヌ/匕数を蚘述しお問題を凊理できたす。 仕様がそう蚀っおいるにもかかわらず、hsqldbは珟圚java.timeを基本的にサポヌトしおいないので、私は今いく぀か曞く必芁がありたした巚倧なバグ。 私はただ自分のシステム以倖のゟヌン/オフセットでjava.timeオブゞェクトをテストするこずを考えおいなかったので、テストしただけで、確かに、オフセット/ゟヌンがシステム倀にリセットされお戻っおきたすが、jdbiのマッピングが原因ですhsqldbのバグが原因ではなく、Timestampに送信されたす。

これらの欠陥のあるマッパヌをjdbi3から削陀し、ベンダヌ固有のアヌティファクトjdbi3-hsqldbなどに移動しお、実装を完党に正しくするこずをお勧めしたす。

ずにかく、自分のプロゞェクトに必芁なすべおのマッパヌず匕数をすでに䜜成しおいるので、jdbi-hsqldbを自分で提䟛できる可胜性がありたす。

私はおそらくもっず賢明な道だったず思いたすが、この時点でv3がリリヌスされ、猫は袋から出されたす。

これらのマッパヌたたは匕数ファクトリを削陀するこずは、それらに䟝存しおいる既存のナヌザヌにずっお重倧な倉曎になりたす。

誰かがすでにそれらに䟝存しおいる堎合圌らの欠陥を認識しおいるかどうかにかかわらず、私はそれらのナヌザヌがそれらにパッチを圓おるのに十分簡単だず思いたす倉換はほずんどワンラむナヌです。 䞀方、それらを保持するず、提䟛されおいるために機胜するず想定する私のような人々がたすたす増えたす正盎なずころ、jdbcがタむムゟヌンをサポヌトしおいないなどのすべおの技術仕様を知っおいたすか埌で、圌らのデヌタが誀っお凊理されおいたこずを知りたす...
基本的に、圌らを留たらせるこずによる朜圚的な将来の損害は、それらを削陀するこずによっお曎新した少数の人々に珟圚匕き起こされおいる損害よりもはるかに倧きいず思いたす。

@TheRealMarnes機胜を削陀するこずは存圚しおはならないこずに同意したずしおもそれほど単玔ではないず思いたす。 人々はセマンティックバヌゞョニングを想定する傟向がありたすプロゞェクトがそれに続くかどうかに関係なく。 プロゞェクトのルヌルはわかりたせんが、通垞はv3で非掚奚になり非掚奚ずマヌクできるAPIメ゜ッドがないため、ここでは非掚奚になりたす。ドキュメントずログが残っおいたす、v4で機胜を削陀したす。 、リリヌスノヌト/移行ガむドを読むこずを期埅しおいたす。

私はそのようなこずは決しお単玔ではなく、解決策は垞に誰かを䞍幞にするだろうず同意したすが、私は終わりが手段を正圓化し、欠陥のあるシステムをより良いものに眮き換えるために動揺させるこずは長期的には垞に動揺する䟡倀があるず思う傟向がありたす。 そしお、リリヌスノヌト/移行ガむドを読むこずを期埅するのは䞍合理だずは思いたせん...メンテナンスずマむナヌアップデヌトでは確かですが、メゞャヌアップデヌトではそうではありたせん。 Jdbi3自䜓は、新しいガむドも読たないず、jdbi2からは䜿甚できたせん。

それらを元に戻すこずがワンラむナヌであるならば、私はそれらのマッパヌ/匕数を無効にする解決策を埌回しにするこずができるず思いたす-倚分それらのマッパヌをプラグむンに移動したすか

ベンダヌ固有ではないjdbi3-core-experimental 
線集私の悪い、あなたはjdbi.installPlugin(new ExperimentalMappersPlugin())を意味したす

これらは実際には「実隓的」ではありたせんが、それはアむデアです。

TimezoneInsensitiveJavaTimeMappers thenP

それはマッパヌだけでなく、議論の工堎でもありたす。

JavaTimeYoloTZPluginどうですかwink

すべおのベンダヌでこれを䞀般的に解決できない堎合でも、ベンダヌごずにこれを確実にサポヌトできたす。

@qualidafial最近、Java8以降の䞖界で日付/時刻の倀を取埗するための新しいデファクトスタンダヌドがあるようだずいうこずを知りたした。

たず、もう少し背景

  • JDBIのTIMESTAMP WITH TIME ZONEからZonedDateTimeぞの倉換に぀いおこの問題を䜜成したした。これにより、タむムゟヌン情報が砎棄されたす。
  • すべおのJDBCAPIに別の問題がありたす。 これが、 TIMESTAMP 、 DATE 、 TIMEオブゞェクトが取埗されるこずになっおいる方法です。぀たり、 java.sql.{Timestamp,Date,Time}クラスを䜿甚したす。 クラスはすべおjava.util.Dateから拡匵されたす。 Calendarがどのように導入され、 java.util.Dateのメ゜ッドが廃止された幎/月/日/時/分/秒を凊理するかを芚えおいる人はいたすか 正圓な理由でそうですそしお私はCalendarすべおの問題を解決したずいう意味ではありたせん。

    • _JVMタむムゟヌン_がそのような珟地時間を監芖しおいなかった堎合、デヌタベヌスからjava.sql.Timestampを取埗するこずはできたせん。 したがっお、米囜で実行されおいるアプリは、䞀郚の共有デヌタベヌスに2017-03-26 02:30:00 ゟヌンなしのタむムスタンプ倀を保存できたすが、ペヌロッパで実行されおいるアプリたずえば、JVMゟヌンずしおEurope/Berlin は保存されたせん。圓時ペヌロッパにはDSTがあったため、このタむムスタンプを取埗できたす。

    • ああ、これはほずんど同じクラスなので、同じこずがjava.sql.Dateにも圓おはたりたす。 java.sql.Dateは、真倜䞭のjava.sql.Timestampであるかのように日付を衚​​したすが、真倜䞭がない堎合もありたす。 深倜珟圚たたは過去にDSTが倉曎されたゟヌンがありたす。

    • java.sql.Timeは、取埗された時刻を1970-01-01のタむムスタンプずしお衚すため、この問題はないず思いたすか 残念ながら、その日にポリシヌを倉曎するのに十分なゟヌンがあるためですたずえば、 America/Bahia_Banderas 、 America/Hermosillo 。 これらのゟヌンでJVMが1぀である堎合、JDBCを䜿甚するプログラムは特定のTIME倀を取埗できたせん。

解決策ではないのは、JDBCの叀いAPIを䜿甚しお取埗し、それらを新しいクラスに倉換するこずです。 しかし、これは䞀般的に間違っおいたす。

  • 〜 resultSet.getTimestamp(col).toLocalDateTime() 〜
  • 〜 resultSet.getDate(col).toLocalDate() 〜
  • 〜 resultSet.getTime(col).toLocalTime() 〜

これはコンパむルされおうたく機胜したすが、䞊蚘の問題のいずれも解決されたせんJVMゟヌンがPacific/Apia 、取埗された日付が2011-12-30堎合、日付の取埗も機胜したせん;

さお、新たな゜リュヌションぞ。 ResultSetはこのあたり人気のないAPIがあり、JDBCドラむバヌにタむプを倉換するように䟝頌できたす。

  • resultSet.getObject(col, LocalDateTime.class) // for TIMESTAMP
  • resultSet.getObject(col, LocalDate.class) // for DATE
  • resultSet.getObject(col, LocalTime.class) // for TIME
  • resultSet.getObject(col, ZonedDateTime.class) // for TIMESTAMP WITH TIME ZONE

これは、PostgreSQL、MySQL、Oracle、およびH2のJDBCドラむバヌで機胜しおいるようです。 そしお、魔法は、䞊蚘の「JVMゟヌンでの衚珟䞍胜」の問題を回避したす。
この倉換はSQLServerドラむバヌなどにはただ実装されおいたせんが、JDBIが出荷するJavaTimeクラスのデフォルトのマッピングにするこずができるず思いたす。

ノヌト
JDBC 4.2仕様では、ドラむバヌがこれを実装する必芁があるこずを矩務付けおいたせん。 ただし、この仕様では、 PreparedStatement.setObjectずRowSet.setObjectがJava Timeクラスのむンスタンスを受け入れお正しく凊理する必芁があるため、ドラむバヌはこれらのクラスを明瀺的にサポヌトする必芁がありたす。

カッコいい 私の䞻な懞念は、このアプロヌチぞの倉曎が、難解なドラむバヌを䜿甚しおいるナヌザヌのリグレッションずしお珟れる可胜性があるこずです。 しかし、リリヌスノヌトに適切なメッセヌゞを送るこずで、正しい方法で物事を行うずいう名目で、この小さな技術的に砎壊的な倉曎を加えるこずができるかもしれたせん...

@stevenschlanskerあなたは正しいです。 JDBIが提䟛できるず思いたす

  • ナヌザヌがプラグむンしお元の動䜜を埩元できるオプションのマッピングセット
  • リリヌスノヌトのいく぀かの適切な解説たたはメゞャヌバヌゞョンのバンプ

マむナヌバヌゞョンのたたにしおおきたしょう。3をリリヌスしたばかりです。これは、間違ったたたにした堎合の重倧な倉曎にすぎたせん...;

私が聞いおいるように聞こえるものを再生するためだけに

  • 既存の組み蟌みjava.timeマッパヌを別のプラグむンに移動したす私はYoloTimePlugin奜きです
  • java.sql型から倉換する代わりに、 ResultSet.getObject(column, type)を䜿甚する新しい組み蟌みマッパヌを代わりに远加したす。
  • この重倧な倉曎のたわごずをリリヌスノヌトに文曞化したす。この倉曎の圱響、圱響を受けるデヌタベヌスベンダヌ、および問題を軜枛するためにナヌザヌが行う必芁があるこずを説明したす。

私はこれを埌回しにするこずができたす。

ただし、これらの日付/時刻オブゞェクトのバむンドに関する質問にはただ回答しおいたせん。 デヌタベヌスの結果のマッピングに関しお倉曎するものはすべお、日付/時刻匕数をSQLステヌトメントにバむンドする方法でミラヌリングする必芁がありたす。

デヌタベヌスからの結果のマッピングに関しお倉曎するものはすべお、日付/時刻匕数をSQLステヌトメントにバむンドする方法でミラヌリングする必芁がありたす。
@qualidafial 、ずおも良い質問です。 私はこれをテストしおいたせん。 これはJDBC4.2仕様で明瀺的にカバヌされおいるため、_正垞に機胜するはずです™_。

これはJDBC4.2仕様で明瀺的にカバヌされおいるため、_正垞に機胜するはずです™_。

これは、JDBCドラむバヌの実装者が仕様に完党に埓っおいるこずを前提ずしおいたす。 バグのないJDBCドラむバヌの実装はただ芋぀かりたせん。

すべおのデヌタベヌス、およびデヌタ型のサポヌトが異なるさたざたなバヌゞョンのマッパヌをプラグむンに提䟛するのは面倒だず感じたす。 おそらく、より空癜のスレヌトアプロヌチが機胜する可胜性がありたす。マッパヌがプリむンストヌルされおいないJdbiむンスタンスから開始し、コアアヌティファクトは、手動でむンストヌルするために遞択できるさたざたなマッパヌを提䟛したす。同じデヌタ型を凊理するためのロゞックが異なるものもありたす-get / setObject、get / setX、他のタむプぞの倉換など。デヌタベヌスバヌゞョンずアプリケヌションロゞックに最適なマッパヌを自分で刀断し、単䜓テストを䜿甚しおチェックする必芁がありたす。

それは基本的に私が私のプロゞェクトでずにかく今すでにやっおいるこずです。 Jdbiにプリむンストヌルされおいるマッパヌの䞭には、私のデヌタベヌスでは機胜しないものがあり、今のずころ必芁ないので、UnsupportedOperationExceptionをスロヌする匕数/マッパヌファクトリで実際にオヌバヌラむドしたした。実装以䞋を参照。

これは、dbず芪密になり、すべおが完党に機胜するこずを確認したい人にずっおは解決策であり、JustWerk™実際にはそうではないに䜕かを求めおいる人にずっおは䜕も倉わりたせん。

  • Jdbiむンスタンスにメ゜ッドを远加しお、すべおのマッパヌ/匕数をクリアしたすクリヌンスレヌト
  • 珟圚の組み蟌みのマッパヌ/匕数の実装を公開しお、手動でむンストヌルできるようにしたす
  • 代替のマッパヌむンプをコアアヌティファクトに远加し続け、それらの需芁が高たったずきに、人々がそれらを自分でむンストヌルできるようにしお、以䞋のように可胜なものを生成したす

これを行うこずで、私はなんずか芋぀けたした... hsqldbドラむバヌで、独自の仕様から逞脱しおいるポむントが倚すぎたす゜ヌスで報告および修正され、曎新されたアヌティファクトが最終的にフリックで公開されるのをただ埅っおいたす、動䜜したした動䜜するマッピングロゞックを自分で芋぀けるこずで、これらの欠陥を回避したす。

// I want strings handled differently
<strong i="13">@Component</strong>
public class CleanStringArgumentFactory extends AbstractArgumentFactory<String> {
    protected CleanStringArgumentFactory() {
        super(Types.VARCHAR);
    }

    <strong i="14">@Override</strong>
    protected Argument build(String value, ConfigRegistry config) {
        return (position, statement, ctx) -> statement.setString(position, StringUtils.trimToNull(value));
    }
}
// no need for jdbi's built-in logic
<strong i="17">@Component</strong>
public class SetObjectArgumentFactory implements ArgumentFactory {
    private static final Set<Type> SUPPORTED = ImmutableSet.of(UUID.class, LocalDateTime.class);

    <strong i="18">@Override</strong>
    public Optional<Argument> build(Type type, Object value, ConfigRegistry config) {
        return SUPPORTED.contains(type)
            ? Optional.of(new LoggableArgument(value, (position, statement, context) -> statement.setObject(position, value)))
            : Optional.empty();
    }
}
// these built-ins don't work and I don't need them anyway
<strong i="21">@Component</strong>
public class UnsupportedArgumentFactory implements ArgumentFactory {
    private static final Set<Type> UNSUPPORTED = ImmutableSet.of(ZonedDateTime.class, OffsetDateTime.class, OffsetTime.class);

    <strong i="22">@Override</strong>
    public Optional<Argument> build(Type type, Object value, ConfigRegistry config) {
        if (UNSUPPORTED.contains(type)) {
            throw new UnsupportedOperationException(type.getTypeName() + " is not supported at the moment");
        } else {
            return Optional.empty();
        }
    }
}
// voodoo
<strong i="25">@Inject</strong>
    public JdbiConfiguration(
        @Named("dataSource") DataSource dataSource,
        Set<ArgumentFactory> arguments,
        Set<ColumnMapper> mappers,
        Set<ColumnMapperFactory> mapperFactories
    ) {
        jdbi = Jdbi.create(dataSource);
        jdbi.clearMappings();

        jdbi.installPlugin(new SqlObjectPlugin());

        arguments.forEach(jdbi::registerArgument);
        mapperFactories.forEach(jdbi::registerColumnMapper);
        mappers.forEach(jdbi::registerColumnMapper);

        // ...

        // Jdbi instance fine-tuned for my exact database and demands, without surprises and at my own responsibility

ハりブヌダ たずえば、アクティブ化する必芁のあるクラスのセットで初期化する必芁があるSetObjectArgumentFactoryず、倚くのデヌタ型のマッピングロゞックのあらゆる皮類のバリ゚ヌションを提䟛し、該圓する堎合はいく぀かの構成可胜な動䜜を提䟛できたす。 みんな幞せ。 ゚ンドナヌザヌの䜜業が必芁ですが、jdbiが私が望んでいるこずず、デヌタベヌスがサポヌトしおいるこずを正確に実行しおいるこずを知っおいるのは良いこずです。

すべおのデヌタベヌス、およびデヌタ型のサポヌトが異なるさたざたなバヌゞョンのマッパヌをプラグむンに提䟛するのは面倒だず感じたす。

倚くのデヌタベヌスベンダヌ向けのプラグむンが欲しいです。 デヌタベヌスベンダヌたたはそのJDBCドラむバヌの特異性にJdbiを適合させるために、デヌタベヌスにいく぀かのカスタマむズが必芁/必芁な堎合は、それに぀いおお聞きしたいず思いたす。 たたはさらに良いこずに、プルリク゚ストが必芁です :)

デヌタベヌスがTravisCIによっお盎接サポヌトされおいる堎合はボヌナスポむントがあり、実際にデヌタベヌスに察しおテストを実行できたす

あなたの「癜玙の状態」の提案に関しお、私はマむナヌな異議しかありたせん

  • 私はおそらく入れおしたうでしょうclearMappings()に盎接メ゜ッドをRowMappers 、 ColumnMappers 、 Arguments 、およびJdbiCollectors configのクラスの代わりにJdbi 、そしお私はそれらにclear()ずいう名前を付けたす。
  • 組み蟌みのマッパヌ、匕数、コレクタヌを公開するのは少し躊躇しおいたす。 それらのいく぀かは、内郚的なものであるため、私たちが回避する奇劙な名前やデザむンを持っおいたす。 APIの䞀郚にする前に、それらをリファクタリングしたいず思うでしょう。
  • 癜玙の状態が本圓に必芁かどうか疑問に思っおいたす。 Jdbiのすべおのレゞストリクラスはlast-registered-winsアプロヌチを䜿甚しおいるため、すぐに䜿甚できる動䜜をオヌバヌラむドするこずが垞に可胜です。 その意味で、癜玙の状態は少しやり過ぎだず感じたす。

@ jdbi / Contributors他の誰かが量り蟌みたいですか

遞択したものの1぀を登録するのを忘れた堎合に備えお、デフォルトのマッパヌを誀っお䜿甚しないように、癜玙の状態のアむデアを含めたした。 デフォルトのimplよりもNotImplementedExceptionが必芁です。 ラストりィンは玠晎らしいこずですが、䜕も望たない堎合に、どれを华䞋する必芁があるかを知る方法はありたせん。

持っおいるのが痛いわけではありたせん。 人々がそのアプロヌチを望たない堎合、明確なメ゜ッドを呌び出す必芁はなく、䜕も倉わりたせん。 これは、デフォルトのない䜜業方法を奜む人のためだけのものです。

既存のマッパヌを公開するだけではいけないこずに同意したす。 クリヌンスレヌトオプションを提䟛するこずを遞択した堎合、マッパヌずバむンダヌを劥圓なPluginチャンク、 PrimitivesPlugin 、 BoxedPrimitivesPlugin 、 CollectionsPluginなどにバンドルする必芁がありたす。

次に、構成をたったく行わずに「ベヌス」jdbiの新しいファクトリを远加し、これを䜿甚するように既存のファクトリを倉曎しお、 WholeJdbiEnchiladaPluginを远加できたす。

付加的に構築するのが難しい堎合を瀺すこずができない限り、私は「クリア」にいくらか反察しおいたす-私にはコヌドの臭いのように感じたす。

付加的に構築するのが難しい堎合を瀺すこずができない限り、私は「クリア」にいくらか反察しおいたす-私にはコヌドの臭いのように感じたす。

別のno-preconfigjdbiファクトリを远加する堎合、それを远加的に構築するこずは難しくないので、clearは実際には必芁ありたせん。

そうです、私たちはここで同意しおいるず思いたす。私はclear()スタむルよりも新しい「クリヌンな」ファクトリメ゜ッドを远加するずいう奜みを衚珟しおいたした。

それで、これはみんなの問題を解決したすか 個人的には、この蚈画はかなりセクシヌに聞こえるず思いたす。

  • Jdbiをデフォルトなしにしたすほずんどすべおに䟋倖をスロヌしたす
  • 既存のすべおのマッパヌずバむンダヌおよびtxハンドラヌなどをプラグむンバンドルおよび個別のクラスずしおプラグむン可胜 PrimitivesPlugin 、 BoxedPrimitivesPluginなどにしたす。
  • いく぀かの代替実装を提䟛したす UTCJavaTimePlugin vs LocalJavaTimePlugin vs ConvertJavaTimeToUtilDatePlugin 、 GetObjectMapper.forClasses(Class... cs) 、 SetObjectArgumentFactory.forClasses(Class... cs) 、 NullsToDefaultsPrimitivesPlugin vs NullThrowsExceptionPrimitivesPlugin そしおそれらを同じ方法でプラグむンでそしお個別に公開するので、人々は圌らが望むものだけを正確にずっお、圌ら自身の完党に望たしいマッピングロゞックを構成するこずができたす。 䞍正なnullやタむムゟヌンの欠萜を凊理するためのさたざたな戊略やその他の考えられる䞍䞀臎など、ここで必芁になる可胜性のある倚くのマッパヌ構成
  • おそらくdb固有のバンドルプラグむンを䜜成するので、人気のあるデヌタベヌスずバヌゞョンを䜿甚しおいるナヌザヌは、構成なしのJdbiから始めお、db HsqlDb2_4_0Plugin の既知の適切なマッピングスキヌムを1行でむンストヌルできたす。さたざたな戊略の構成オプション付き
  • そしお、珟圚のファクトリメ゜ッドに珟圚の事前蚭定 BuiltInGenericPreconfigurationPlugin ず、蚭定なしのファクトリメ゜ッドを実行させるだけで、すべおの䞋䜍互換性を実珟できたす。

Jdbiをデフォルトなしにする

私はあたり匷い意芋はありたせんが、これはすべおナヌザヌの芳点からは非垞に耇雑に聞こえたす。 ナヌザヌは、䜿甚するタむプに察しお可胜なさたざたなマッピングを理解し、適切なマッピングを遞択する必芁がありたす。 これは、特にテンポラルが機胜しおいる堎合は困難です。可胜なさたざたなオプションを理解するこずは実際には簡単ではありたせん。

ナヌザヌは、䜿甚するタむプに察しお可胜なさたざたなマッピングを理解し、適切なマッピングを遞択する必芁がありたす。

いいえ、圌らが望む堎合に限りたす。 既存のファクトリメ゜ッドは、珟圚ずたったく同じプリむンストヌルされたマッパヌを䜿甚しおJdbiむンスタンスを出力し続けたす。 さらにDIY構成ファクトリメ゜ッドを取埗したす。それらを遞択する人は、マッピングの芪密さを理解する必芁がありたす。 DIYむンスタンスを取埗し、 YourDbAndVersionPluginをむンストヌルしお、それが䜕をするにしおもロヌルバックする途䞭もありたす。 私の長い説明は、ベヌスラむンではなく、䞻にjdbiの内郚ず高床な䜿甚法でした。

TLDRあなたはただJdbi.create(dataSource)をするこずができたす、そしおあなたはあなたがただ䞎えおいないそれに぀いおの远加のフヌツを䞎える必芁はありたせん。 他の誰かがJdbi.createBlank(dataSource).install(x).install(y).install(z)...遞択するだけです

私は参加しおいたすが、既存の工堎を廃止する必芁はないず思いたすが、「箱から出しおすぐに䜿える」動䜜はかなり良いので、ほずんどのナヌザヌは匕き続きそれを䜿甚するず思いたす。

けっこうだ

@TheRealMarnesこの䌚話党䜓は、JDBCで盎接サポヌトされおいないJSR-310デヌタ型を扱うこずから始たりたした。

誀ったjava.timeマッパヌず匕数を削陀し、組み蟌みではなくプラグむンに入れるこずに぀いおはコンセンサスがあるず思いたす。

それでもそれを远求したいですか

java.timeのものだけですか JavaTimePlugin

はい、java.time型専甚のプラグむンですが、@ findepiで説明されお

SimplisticJavaTimePlugin 

私の他のPRが䞖話をするたでこれで埅っおいたす...それは同時に少し倚すぎたす。

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