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) を使用できましたが、プロパティ名で検索するにはどうすればよいですか?