-1

Spring MVC と Hibernate と MySQL を使用しています。

基本的にこれを行うコードがあります

@Transactional("transactionName")
public Product find(List<String> allProductNames){
     for(String product: allProductNames){
         //find product with productName
         Product product = em.createQuery(hql).getSingleResult());
         if(product == null){
            //create product object
             em.persist(newProduct)
         }
     }
}

保存と検索は同じトランザクションの一部であるため、メソッドから出るまで何もコミットされません。productName の製品を検索するためのデータベースへのクエリは、常に null を返します。セッションでアタッチされたオブジェクトも検索するように hibernate を強制するにはどうすればよいですか?

私は試した

SessionImpl session = (SessionImpl) em.getDelegate();
Query query = session.createQuery("searchproductnamequery")
                     .setParameter("PRODUCT_NAME","iPhone");
boolean found = session.contains(query);

しかし、上記もfalseを返すようです。このような状況を処理する正しい方法は何でしょうか? デフォルトでは、添付されたセッションオブジェクトとデータベースの両方を休止状態で検索するべきではありませんか?

コミットしたくない理由は、コミットされる前にカウント属性を製品に更新したいからです。

製品のマップを作成し、最後にコミットすることはできますが、100,000 個の productNames のリストを 2 回ループするのは非常にコストがかかります。

ID がわかっている場合は session.get(id) を使用できましたが、プロパティ名で検索するにはどうすればよいですか?

4

1 に答える 1

0

保存後の em.flush() はうまくいきました。

于 2013-02-20T06:21:47.447 に答える