0

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() も試しましたが、うまくいきませんでした。

これが適切な解決策でない場合は、他の解決策に耳を傾けます。

ありがとう、ディエゴ。

4

2 に答える 2