Hibernateでの@Temporalアノテーションの用途は何ですか?


100

Hibernateドキュメントには、@Temporalアノテーションに関する以下の情報があります。

プレーンJava APIでは、時間の時間精度は定義されていません。時系列データを処理する場合、データベースで期待される精度を記述したい場合があります。一時データは、DATE、TIME、またはTIMESTAMPの精度(つまり、実際の日付、時刻のみ、またはその両方)を持つことができます。@Temporalアノテーションを使用して微調整します。

どういうtemporal precision of time is not defined意味ですか?temporalデータとその精度とは何ですか?どのように微調整しますか?


3
EntityプロパティとしてCalendarを使用すると、プレーンJavaでは、たとえばデータベースに保存するときに必要のない多くの情報が出力されます。その場合、@ Temporal(TemporalType.TIMESTAMP)のようになります。エンティティのカレンダーカレンダー。データベースにタイムスタンプを保存するか、カレンダープロパティで@Temporal(TemporalType.DATE)または@Temporal(TemporalType.TIME)に変更して、日付または時刻のみを保存します。
user3487063 14

回答:


103

この注釈は、タイプjava.util.Dateとの永続フィールドまたはプロパティに指定する必要がありますjava.util.Calendar。これらのタイプのフィールドまたはプロパティに対してのみ指定できます。

Temporal注釈は、と組み合わせて使用することができますBasic注釈、Id注釈またはElementCollection注釈(要素収集値は、一時的なタイプのものである場合。

プレーンJava APIでは、時間の時間精度は定義されていません。時系列データを処理する場合、データベースで予想される精度を記述したい場合があります。一時データは、DATE、TIME、またはTIMESTAMPの精度(つまり、実際の日付、時刻のみ、またはその両方)を持つことができます。@Temporalアノテーションを使用して微調整します。

時系列データは、時間に関するデータです。たとえば、コンテンツ管理システムでは、記事の作成日と最終更新日は一時的なデータです。場合によっては、時系列データに正確さが必要であり、正確な日付/時刻またはその両方を保存したい場合があります(TIMESTAMP、データベーステーブルに)を格納する必要があります。

時間精度はコアJava APIでは指定されていません。@Temporalは、JPAタイムスタンプとの間で前後に変換される注釈ですjava.util.Date。またtime-stamp、時間に変換されます。たとえば、次のスニペットで@Temporal(TemporalType.DATE) は、時刻の値を削除し、日付のみを保持します

@Temporal(TemporalType.DATE)
private java.util.Date creationDate;

javadocsによると、

クエリメソッドパラメータで適切な{@code TemporalType}を宣言するための注釈。この注釈は、デフォルトでタイプが{@link Date}のパラメーターでのみ使用できることに注意してください。TemporalType.DATE

[上記の情報はさまざまなソースから収集されました]


JavaタイプのTimestampと一緒に使用できないのはなぜですか?
powder366

3
TemporalType.TIMESTAMPだけを使用している場合、このアノテーションを使用する意味はありますか?日付は、それなしでこの目的のために
正常に機能

MySql DBに次の形式で保存する方法yyyy-MM-dd
Shantaram Tupe

@shantaram_t これはあなたに役立つかもしれません
アンクル

1
:私は入力を持っている02/10/2017し、それを変換したい2017-10-022017/10/02
シャンタラムTupe

42

@Temporal 次の列項目のデータベーステーブルに格納するために使用できるJPAアノテーションです。

  1. 日付java.sql.Date
  2. 時間java.sql.Time
  3. タイムスタンプjava.sql.Timestamp

一般にDate、クラスでフィールドを宣言して格納しようとする場合。TIMESTAMP
としてデータベースに保存されます

@Temporal
private Date joinedDate;

上記のコードは、08-07-17 04:33:35.870000000 PMのような値を格納します

データベースにDATEのみを保存する場合は、
を使用または定義できますTemporalType

@Temporal(TemporalType.DATE)
private Date joinedDate;

今回は、08-07-17を格納しますをデータベースにします

他にもいくつかの属性があり@Temporal、要件に基づいて使用できます。


デフォルト値はTemporalType.DATEです。時刻の部分に注釈が付けられていない属性値を提供した理由がわかりません。
Simon Logic

2つの日付が同じ場合、上記のアスペクトは機能します(TemporalType.DATE)。
Lova Chittumuri

回答をコピーして貼り付けないでください。stackoverflow.com/questions/25333711/...
LOVA Chittumuri

10

時間型は、永続的な状態マッピングで使用できる時間ベースの型のセットです。

サポートされる一時的なタイプのリストが含まれて3 java.sql種類をjava.sql.Datejava.sql.Timejava.sql.Timestamp、それが2つの含まjava.util種類java.util.Datejava.util.Calendar

java.sqlタイプは、完全に手間のかからないです。他の単純なマッピングタイプと同じように機能し、特別な考慮は必要ありません。

java.utilただし、java.sqlJDBCドライバーと通信するときに使用するJDBC タイプを示すために、2つのタイプには追加のメタデータが必要です。これは、注釈を付けて@Temporal注釈を付け、TemporalType列挙型の値としてJDBCの型を指定することによって行われます。

それぞれのjava.sqlタイプを表すために、DATE、TIME、およびTIMESTAMPの3つの列挙値があります。


4

これを使って

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}

4

短い答えを探している場合:

java.util.Dateを使用する場合、JavaはSQLタイプに直接関連付ける方法を実際には知りません。これが登場@Temporalするのです。必要なSQLタイプを指定するために使用されます。

ソース:Baeldung


3

私はHibernate 5.2を使用しており、@Temporalもう必要ありません。
java.util.datesql.datetime.LocalDateは、Date / timestampとして適切なデータ型でDBに格納されます。


次に、Hibernate 5.xを使用して日付のみを保存する場合の解決策は何
ですか

Java 8 LocalDateの使用
Josh

1

@Temporalアノテーションを使用して、データベーステーブルに日付、時刻、またはその両方を挿入します。TemporalTypeを使用して、データ、時刻、または両方のintテーブルを挿入できます。

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.