Java Spring-Hibernate同步数据库更新问题

时间:2014-09-05 19:25:29

标签: java spring hibernate synchronization

我正在尝试在调用函数时创建一个用户(在同步块中)。当有多个并行调用时,即使用户已在同步块中创建,它也会创建具有相同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没有返回正确的数据。

1 个答案:

答案 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;
    }