我正在尝试在调用函数时创建一个用户(在同步块中)。当有多个并行调用时,即使用户已在同步块中创建,它也会创建具有相同emailId的多个用户。
请注意,我数据库中的emailId字段不是唯一的,我无法将其更改为唯一。
public class UserServiceImpl implements UserService {
public void myFunction(String emailId){
//do something
synchronized(this)
{
boolean userExists = checkDuplicateEmail(emailId); //checkDuplicateEmail is a hibernate query.
if(!userExists){
createUser();
}
}
}
}
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
public boolean checkDuplicateEmail(String email) throws TechnicalException {
try {
boolean isExist = false;
Session session = getHibernateTemplate().getSessionFactory().openSession();
session.flush();
DetachedCriteria criteria = DetachedCriteria.forClass(user.class);
criteria.add(Property.forName("emailId").eq(email));
criteria.setProjection(Projections.count("emailId"));
List users = getHibernateTemplate().findByCriteria(criteria);
if (users != null && users.size() > 0) {
if (((Integer) users.get(0)) > 0l) {
isExist = true;
}
}
return isExist;
} catch (DataAccessException dataAccessException) {
throw dataAccessException;
}
}
}
块以同步方式执行。但是hibernate没有返回正确的数据。
答案 0 :(得分:0)
您说您的标准结果不正确: 尝试在您的电子邮件中设置uniqueResult,如果条件返回null,则表示该电子邮件中的用户不在数据库中:
User user =(User)session.createCriteria(User.class)
.add( Restrictions.eq("emailId",email)
.setMaxResults(1)
.uniqueResult();
if(user!=null){
isExist=true;
}
else{
isExist=false;
}