-1

Spring / Hibernateプロジェクトがあり、データベースに日付を保存しようとしていますが、機能していません。それは愚かなことであるに違いありませんが、私は自分が何を間違っているのかわかりません。

これが私のコードです:

user.setFailedPasswordAnswerAttemptCount(0);
user.setLastLoginDate(new Date());
user.setIsOnline(true);

他の2つの変数(failedPasswordAnswerAttemptCountとisOnline)は、問題なくデータベースに書き込まれています。また、java.sql.Timestampの代わりにjava.util.Dateを渡すだけで試してみました...同じ結果です。プロパティがユーザーオブジェクトでどのように定義されるかを次に示します。

private Date lastLoginDate;

@Temporal(TemporalType.TIMESTAMP)
@Column(name="last_login_date")
public Date getLastLoginDate() {
    return this.lastLoginDate;
}

public void setLastLoginDate(Date lastLoginDate) {
    this.lastLoginDate = lastLoginDate;
}

列の定義は次のとおりです。

`last_login_date` datetime DEFAULT NULL

何か助けはありますか?これが機能しているはずなので、他に何を探すべきかさえわかりません。

エラーに関する詳細:休止状態ログにエラーや奇妙なメッセージはありません。Hibernateログにはパラメーター化されたクエリが表示されていますが、実際に何を書き込んでいるのかはわかりません。列がまったく更新されていないようです。つまり、日付がすでに存在する場合は変更されません。または、nullの場合は変更されません。

更新:ログを確認しましたが、Hibernateは適切なデータを書き込んでいるようですが、すぐに間違ったデータを再度書き込みます。ログに次のエントリが表示されます。

11:15:12.280 [http-bio-8080-exec-26] TRACE o.h.e.def.AbstractSaveEventListener - detached instance of: com.hi.model.User
11:15:12.280 [http-bio-8080-exec-26] TRACE o.h.e.def.DefaultMergeEventListener - merging detached instance

そしてその直後に、lastLoginDateの古い値が元に戻されているのがわかります。

4

3 に答える 3

0

なぜ使用しているのですか

Date date = new Date();
user.setLastLoginDate(new Timestamp(date.getTime()));

これだけじゃないの?

user.setLastLoginDate(new Date());

最初-日付とタイムスタンプを同時に使用したくない場合があります(コレクションなど)

Javaプラットフォームライブラリには、インスタンス化可能なクラスを拡張し、値コンポーネントを追加するクラスがいくつかあります。たとえば、java.sql.Timestampはjava.util.Dateを拡張し、ナノ秒フィールドを追加します。Timestampのequals実装は対称性に違反し、TimestampオブジェクトとDateオブジェクトが同じコレクションで使用されているか、そうでなければ混合されている場合、不安定な動作を引き起こす可能性があります。Timestampクラスには、日付とタイムスタンプが混在しないようにプログラマーに警告する免責事項があります。それらを分離しておけば問題は発生しませんが、それらを混合することを妨げるものは何もなく、結果として生じるエラーはデバッグが難しい場合があります。Timestampクラスのこの動作は誤りであり、エミュレートすべきではありません。(Bloch、Effective Java、第2版)

2番目-私はあなたの例をチェックしました、そしてそれはmysql-connector(5.1.21)/ hibernate(4.0.1)で私のためにうまく働きます

arquillian統合テストを使用して簡単なテストプロジェクトを準備しました(実行する前にjbossを準備する必要があります): https ://github.com/rchukh/StackOverflowTests/tree/master/13803848

Hibernateバージョン、mysqlバージョン、mysqlエンジン(MyISAM、InnoDBなど)など、さらに情報を提供できる場合は、これが単なる設定ミスである可能性があります。

于 2012-12-10T20:54:45.237 に答える
0

問題を見つけました。私はいくつかのコードをリファクタリングしています、そしてそれは私がこれをしていたように見えます:

//get user object
User user = getUser();
//call a function which modifies user
functionModifiesUser();
//modify user
user.blah = blah;
entityManager.merge(user);

そのため、保存しようとしたときに、親関数にユーザーオブジェクトの古いコピーがありました。実際、mergeステートメントを削除するだけで修正できました。しかし、私はコードをリファクタリングして、これらすべてを1か所にまとめました。

于 2012-12-11T18:06:12.043 に答える
-1

うまくいくように列last_login_dateを設定することtimestampは、少なくとも私にとってはうまくいきます。

于 2012-12-10T16:40:06.370 に答える