0

struts2に、データベースにオブジェクトを照会し、いくつかの変更を加えてコピーするアクションがあります。次に、コピーから新しいobjectIDを取得し、objectID.txtというファイルを作成する必要があります。

ここに関連するコードがあります:

アクションクラス:

ObjectVO objectVOcopy = objectService.searchObjects(objectId);
//Set the ID to 0 so a new row is added, instead of the current one being updated
objectVOcopy.setObjectId(0);
Date today = new Date();
Timestamp currentTime = new Timestamp(today.getTime());
objectVOcopy.setTimeStamp(currentTime);
//Add copy to database
objectService.addObject(objectVOcopy);
//Get the copy object's ID from the database
int newObjectId = objectService.findObjectId(currentTime);
File inboxFile = new File(parentDirectory.getParent()+"\\folder1\\folder2\\"+newObjectId+".txt");

ObjectDAO

//Retrieve identifying ID of copy object from database
List<ObjectVO> object = getHibernateTemplate().find("from ObjectVO where timeStamp = ?", currentTime);
return object.get(0).getObjectId();

問題は、多くの場合、ObjectDAO検索メソッドが何も返さないことです。デバッグしているときに、渡されるタイムスタンプcurrentTimeは、通常、データベースの値から約1〜2ミリ秒ずれていることに気付きました。このバグを回避して、渡されたタイムスタンプから3ミリ秒以内のタイムスタンプを持つオブジェクトを検索するようにHibernateクエリを変更しましたが、この不一致がどこから来ているのかわかりません。currentTimeを再計算していません。データベースに書き込むのと同じものを使用して、データベースから取得します。また、これを別のサーバーにデプロイすると、差異が大きくなる可能性があることも心配しています。objectIDを除いて、これは唯一の一意の識別子であるため、コピーオブジェクトを取得するためにそれを使用する必要があります。

なぜこれが発生しているのか誰かが知っていますか?単に範囲を検索するよりも良い回避策がありますか?私はMicrosoftSQLServer2008R2を使用しています。

ありがとう。

4

2 に答える 2

3

SQL ServerのDATETIMEデータ型の精度は、他の言語で生成できるものと正確には一致しません。SQL Serverは0.003に最も近い値に丸めます-これが、次のように言える理由です。

DECLARE @d DATETIME = '20120821 23:59:59.997';
SELECT @d;

結果:

2012-08-21 23:59:59.997

次に、試してください:

DECLARE @d DATETIME = '20120821 23:59:59.999';
SELECT @d;

結果:

2012-08-22 00:00:00.000

SQL Server 2008 R2を使用しているため、DATETIMEではなくDATETIME2データ型を使用する必要があります。

そうは言っても、@ RedFilterは良い点です。代わりに、生成されたIDを使用できるのに、なぜタイムスタンプに依存しているのでしょうか。

于 2012-08-21T16:04:13.060 に答える
1

これは間違っていると感じます。

objectIDを除いて、これは唯一の一意の識別子です

データベースには、理由から一意の識別子の概念があります。オブジェクトのインスタンスを取得するには、実際にそれを使用する必要があります。

Hibernateセッションでgetメソッドを使用して、セッションと第2レベルのキャッシュも利用できます。

このアプローチでは、オブジェクトを取得するたびにクエリを実行します。

于 2012-08-21T16:04:50.490 に答える