我正在使用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);
但上述似乎也是假的。处理这类情况的正确方法是什么?默认情况下,不应该hibernate搜索附加的会话对象和数据库吗?
我不想提交的原因是因为我想在提交之前将count属性更新为产品。
我可以创建一个产品地图,然后在最后提交,但两次循环两次100,000个productNames的列表是非常昂贵的。
如果我知道id我可以使用session.get(id)但是如何通过属性名称搜索?
答案 0 :(得分:0)
em.flush()完成了这个伎俩。