Java.time.Instant
は、DBに日付を格納するのに最適な選択です。最も可能性が高いのは[〜#〜] timestamp [〜#〜]であり、タイムゾーンに依存しない、それは時間のほんの一瞬です。
JPAはLocalDate
、LocalTime
、LocalDateTime
などをサポートしていますが、インスタントはサポートしていません。確かに、AttributeConverter
または Jadira のようないくつかのライブラリを使用できますが、なぜそのままではサポートされないのですか?
もう一度やってみます。 問題 でいくつかの議論があります。最新の議論は次のようです:
mkargは言った:それは完全に正しいですが、技術的な答えはもう少し複雑です:データ型を必須の型マッピングのセットに含める資格があるようにする最終的な述語は何ですか?
述語は「必須」または「常用」であると言えるかもしれませんが、「必須」または「常用」とは何を定義するのでしょうか。一部のアプリケーションについては、Java.awt.ImageおよびJava.net.URLのサポートが、LocalDateまたはZonedDateTimeのサポートよりもはるかに重要である場合があります。一方、他のアプリケーションはLocalDateでいっぱいになる可能性がありますが、Instantを使用することはありません。それで、どこで正確にカットをするのですか?これは、JREで見つかった型の数を調べると特に複雑になり、どこかでカットが必要になることは明らかです。 JREにバンドルされているJavaFXでも、v8ではInstantをまだサポートしていません。なぜJPAが必要なのでしょうか。そして、プロジェクトジグソーの現在の進捗状況を見ると、適格述語は単に「特定のジグソーモジュールのすべてのタイプ」で答えられるかもしれません。
とにかく、決めるのは私次第ではありません。私はあなたのリクエストをサポートしています。特にすべてのJava Time API時間、特にInstantとDurationのサポートが必要です。リクエストには、たとえばJava私が最近学んだチャンピオンArun Gupaですが、最終的な答えは、私たちがそれを望んでいるほど単純で満足できるものではないでしょう。
たぶん、「Javaプラットフォームの一般的なデータ型変換」のような別のJSRをセットアップする方が良いでしょう。これは、日付と時刻だけではなく、より多くのマッピングを提供しますが、バインドされません。 JPAに変換するだけでなく、JAXB、JAX-RS、および「API」に変換する問題に対処するためのAPIを使用することもできますか?このような車両を使用すると、ボイラープレートを大幅に削減できます。
TL-DR;タイプはたくさんあります。どこかに線を引かなければならなかった。
今後のJPAバージョンに追加するための 新しい問題 があります。
a thread で Douglas Surber (JDBCで動作)で見つけたもう1つの興味深い分析:
JDBCのJDK 8バージョンは、310クラスに対応するほとんどのSQLタイプをサポートしています。
- 日付-LocalDate
- 時間-現地時間
- タイムゾーンなしのタイムスタンプ-LocalDateTime
- タイムゾーン付きタイムスタンプ-OffsetDateTime
JDBCのJDK 8バージョンには、INTERVAL型と対応する310クラスの間のマッピングが含まれていません。
他の310クラスに正確に対応するSQLタイプはありません。その結果、JDBC仕様は他のすべてのクラスに対してサイレントです。
JDBC開発者に新しい310クラスを使用することを強くお勧めします。 Java.util.Date、Java.sql.Date、Java.sql.Time、およびJava.sql.Timestampに問題があります。これらは非推奨と見なす必要があります。 310クラスは非常に優れています。
ダグラス
TL:DR;一時データをデータベースに格納する4つの可能な方法のそれぞれについて、1つのJava 8タイプを選択しました。
最後に、 this thread に目を通すと、標準のAPIを小さくシンプルに保つという大きな文化的プレッシャーがあるようです。
これはJPAの問題ではなく、JDBCの問題です。
JDBCは日付、タイムスタンプ、LocalDate、LocalTime、LocalDateTimeをサポートしますが、NOT Instantです。
これは、Java=の問題ではなく、SQLの問題であり、データベースに格納されるのは年月日日時分秒の構造です。
SQL関数について考えてみましょう:YEAR()MONTH()など...
これらの関数は、1970年以降、単純なミリセンコードには適用できません。これらの関数を実行するには、LocalDateTimeコンストラクトが必要です。