2009-09-01 9 views
3

私はこの問題を最後の2時間デバッグしていますが、成功していないため、私はそれをSOに投げ捨てて、どこに行くのか見ています。Hibernateを使用してMySqlにjava.util.Dateを永続させる問題

私は、HibernateとDAO/DTOパターンを使用してMySqlデータベースにデータを永続化するJavaプログラムを開発しています。私のデータベースでは、firstLoginDate列のmemberprofileテーブルがあります。データベースでは、その列のSQL型はDateTimeです。 HibernateのXMLファイルの対応するセクションでは、私は(Javaで)そのテーブルにDateを保存しようとすると、「日付」(年/月/日)の一部が正しく永続化されている、しかし

<property name="firstLoginDate" type="timestamp"> 
    <column name="firstLoginDate" sql-type="DATETIME"/> 
</property> 

ですが、 「時間帯」の部分(時間:分:秒)はありません。たとえば、2009-09-01 14:02:23を表すJavaの日付を保存しようとすると、データベースで終わるものは2009-09-01 00:00:00になります。

私はすでに、自分のコードが時間コンポーネントを踏んでいないことを確認しました。私がソースコードを見ることができる限り(デバッグ中)、時間コンポーネントは正しいままです。しかし、変更をコミットした後、MySql Query Browserを使用して関連する行を調べることができます(またはJavaコード内のデータベースから戻ってくるだけです)。実際、時間コンポーネントはありません。何か案は?

java.util.Dateの代わりにjava.sql.Timestampを保持しようとしましたが、問題は残りました。また、私はこの動作を全く示さない別のテーブルに非常に似た列を持っています。

皆さんにご質問があると思いますので、必要に応じて編集します。ありがとう!


編集@Nate:

... 
MemberProfile mp = ... 
Date now = new Date(); 
mp.setFirstLoginDate(now); 
... 

MemberProfileはかなりDTOのラッパークラスです。最初のログイン日を設定すると、DTOのフィールドが設定され、変更がコミットされます。


編集2:それだけで私のマシン上で発生しているようです。私は既にテーブルスキーマを再構築して、私のローカルソースをすべて抹消し、CVSから再チェックアウトしましたが、改善はありませんでした。今私は本当に困っている。


編集3:は完全にも、問題を解決しませんでした、私のMySQLのインストールを拭く、それを再インストールし、既知の正常なコピーからデータベースを復元します。

+0

JavaコードでfirstLoginDateの値をどのように設定していますか? – Nate

答えて

1

私は(私の作品を除いて)あなたに似たセットアップを持っている、と私のマッピングファイルは、次のようになります。

<property name="firstLoginDate" type="timestamp"> 
    <column name="firstLoginDate" length="19"/> 
</property> 

私のデータベースはdatetime型として、列の定義を示しています。

編集:チェックする

いくつかのより多くの事...

  • チェックMySQLドライバの作業機械のように、ローカル上で同じ います。
  • テーブルを削除して、 の休止状態を作り直してみてください。 が動作する場合は、 に問題があります。
0

これは問題の可能性がありますが、日付/時刻情報に重大な問題があります。データベースサーバーがデータを送信しているマシンと異なるタイムゾーンにある場合、データは保存されます。

@Column(name="COLUMN_NAME", length=11) 
0

それはあなたのために実行可能である場合は、クラスに建てられ、あなたよりもはるかに進歩してJodaTime DateTimeクラスを使用することを検討してください:私たちの注釈の設定と、それは次のようになります

その向こう

、 (org.hibernate.annotations.Type @

:としてもタイプを休止私は、カスタムのための注釈と私のフィールドやゲッターをマークし、それらを使用してHibernateのサポート

で休止状態を使用してそれらを持続することができますタイプ=「org.joda.time.contrib.hibernate.PersistentDateTime」) @Column(名前は=「日付」)

これは私のために正常に動作し、それがまた、正しいスキーマ生成SQL

を生成し、これが正常に動作しますMySQLで

-1

一時的なアノテーションの横にTemporalType.TIMESTAMPを使用します。

以下の例を確認してください。

@Temporal(TemporalType.TIMESTAMP) 
public Date getCreated() { 
    return this.created; 
} 
+0

OPはXMLマッピングファイルを使用しています。 –

関連する問題