我正在使用 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。如何强制休眠也搜索会话中的附加对象?
我试过了
SessionImpl session = (SessionImpl) em.getDelegate();
Query query = session.createQuery("searchproductnamequery")
.setParameter("PRODUCT_NAME","iPhone");
boolean found = session.contains(query);
但以上似乎也返回错误。处理此类情况的正确方法是什么?默认情况下不应该休眠搜索附加的会话对象和数据库吗?
我不想提交的原因是因为我想在提交之前更新产品的计数属性。
我可以创建一个产品地图,然后在最后提交,但是在 100,000 个产品名称列表中循环两次非常昂贵。
如果我知道我可以使用 session.get(id) 的 id 但我如何通过属性名称进行搜索?