Spring + Hibernate + DBUnit + MySQL アプリケーションがあります。
手順は次のとおりです。
1. I launch the application.
2. A DBUnit test loads data directly into the database (via JDBC).
3. I perform operations and HQL queries to assert the results.
ステップ 2 の直後に、コンソールからデータベースにクエリを実行し、データが正しく読み込まれたことを確認します。私の問題は、手順 3 で、HQL クエリを介して取得したオブジェクトに、手順 2 で読み込まれた値が含まれていないことですが、元の値 (手順 1 以前で存在していたもの) が含まれています。
ここでいくつかの投稿を読んだ後、Hibernate に直接データベース フェッチを強制するために、ステップ 3 の前にセッション キャッシュと第 2 レベル キャッシュを消去することにしました。しかし、問題はまだ解決していません。
私が間違っていることはありますか?
ステップ3で試しているスクリプトは次のとおりです。
アプリケーションを起動する前 (ステップ 1)、データベースの口座残高は 125 です。ステップ 2 で、DBUnit はデータベースの残高を 10 に変更します。
// A break-point here allows me to check through a console that balance at database is cartainly 10.
// I query the account and print the balance, which is 125.
List l1 = this.getHibernateTemplate().find("select a from Account a where a.number = ?", parameter);
Account account1 = (Account) l1.get(0);
System.out.println("A.- Account 1 balance: " + account1.getBalance());
// I clear session cache and second-level cache.
this.getSession().evict(account1);
this.getSessionFactory().evict(Account.class);
this.getSessionFactory().evictQueries();
// I repeat the same query, now expecting to force a database fetch. But it still prints 125 and not 10.
List l2 = this.getHibernateTemplate().find("select a from Account a where a.number = ?", parameter);
Account account2 = (Account) l2.get(0);
System.out.println("B.- Account 2 balance: " + account2.getBalance());
refresh(account1) と session.clear() も試しましたが、うまくいきませんでした。
これが適切な解決策でない場合は、他の解決策に耳を傾けます。
ありがとう、ディエゴ。