私はこの問題を最後の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のインストールを拭く、それを再インストールし、既知の正常なコピーからデータベースを復元します。
JavaコードでfirstLoginDateの値をどのように設定していますか? – Nate