6

この例で「lastAccessed」の日付がデータベースに保存されない理由と、それをDBに保存する方法を誰かが説明できますか?私の理解では、doオブジェクトはsave()呼び出しの後にアタッチされたオブジェクトであるため、すべての変更は自動的に永続化される必要があります。

注:「myDate」は正しく保持されているため、他のすべてのSpring構成は正しいようです。

@Transactional(readOnly = false)
public DateObject getOrCreateDateObject(Date myDate) {
    DateObject do = null;

    do = getCurrentDateObject();  // For my tests, this has been returning null

    if (do == null) {
        // create a new object
        do = new DateObject();
        do.setDate(myDate);
        sessionFactory.getCurrentSession().save(do);
    }

    // This does not persist to the database
    do.setLastAccessed(new Date());

    return do;
}

また、save()呼び出しの後で、次の組み合わせのいくつか(およびそれ以上)を試しました。これらの作業はありません:

sessionFactory.getCurrentSession().merge(do);  // tried before and after do.setDate(d2)

sessionFactory.getCurrentSession().update(do);

sessionFactory.getCurrentSession().saveOrUpdate(do);

sessionFactory.getCurrentSession().flush();

DateObject doCopy = (DateObject)sessionFactory.getCurrentSession().load(DateObject.class, do.getId());
sessionFactory.getCurrentSession().merge(doCopy);
doCopy.setLastAccessed(new Date());

これが私が見ていなかった簡単な答えであることを願っています。ご協力ありがとうございました!

編集#12012年5月22日

要求に応じて、src / main / resources / META-INF/dateobject.hbm.xmlで指定されているこのエンティティのマッピングを次に示します。mysqlクライアントで「SELECT*FROMdateObjects」を使用してデータベースに列が作成されていることがわかります。MY_DATEは正しく入力されていますが、LAST_ACCESSEDはNULLに設定されています。

<class name="com.example.entity.DateObject" table="dateObjects">
    <id name="id" column="DATE_OBJECT_ID">
        <generator class="identity" />
    </id>
    <property name="date" type="date" column="MY_DATE" />
    <property name="lastAccessed" type="date" column="LAST_ACCESSED" />
</class>

編集#22012年5月24日

https://github.com/eschmidt/dateobjectに動作するSSCCEがあります。興味深いことに、Webクライアント(localhost:8080 / view / testを呼び出す)はlastAccessedが正しく設定されていることを示していますが、MySQLクライアントでデータベースを確認すると、lastAccessedがNULLであることが示されています。この完全なコードセットを使用すると、メソッドが@Transactionalとマークされているのに、データベースが更新されない理由を誰かが理解できますか?

4

2 に答える 2

2

do.dateそのコードを実行した後、データベースに保存されていて保存されていないことが確実な場合do.lastAccessed、接続とトランザクションは明らかに正しく設定されています。それが最も簡単な解決策であるため、私の最初の推測は間違ったマッピングでしょう。@Transientのフィールド、ゲッター、またはセッターをたまたま持っていませんlastAccessedよね?(もちろん、注釈を使用してドメイン オブジェクトをマッピングしていると仮定します。)

SSCCEを提供していただければ、私または他の誰かが決定的な回答を提供できると確信しています。

更新:アプリケーション全体を可能な限り最小のコードに切り詰めて問題を示すのは困難です。結論としては、その過程で答えが見つかる可能性が高いということです。私はgithub にたくさんのサンプル プロジェクトを持っています。正しい方向へのちょっとした微調整が必​​要な場合に役立つかもしれません。basic-springmvcはあなたがしていることに最も近いかもしれませんが、マッピングに xml の代わりに注釈を使用します。また、Spring MVC プロジェクトでもあります。サーブレット コンテナー全体と、Spring MVC が必要とする複数のコンテキストについて心配するよりも、メイン クラスで Spring コンテキストを手動で開始する方がはるかに簡単です。たとえば、 spring-method-cachingには、それを行う例があります。

あなたが投稿したマッピングに関しては、問題ないように見えますが、XML マッピングに触れてから長い時間が経ちました。フィールドまたはプロパティ アクセスを使用していますか? それはもしかしたら物事に関係しているかもしれません。また、SessionFactory に、オブジェクトを操作している可能性のあるカスタムリスナーまたはインターセプターはありますか?

于 2012-05-23T02:51:36.843 に答える
0

識別子生成戦略に IDENTITY 生成を使用しているため、ここでの save() 呼び出しはすぐに挿入に変換されます。その後、INSERT/UPDATE/DELETE SQL が実行されましたか? そうでない場合は、セッションがフラッシュされていない可能性があります。フラッシングはいくつかのポイントで発生する可能性があります。慣れていない場合は、フラッシングに関するドキュメントを読んでください。

于 2012-05-23T12:49:42.583 に答える