【问题标题】:Java Spring-Hibernate synchronize issue on database update [duplicate]Java Spring-Hibernate数据库更新同步问题[重复]
【发布时间】:2014-09-05 19:25:29
【问题描述】:

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

【问题讨论】:

  • 在事务中进行同步是很常见的错误。我很确定我将能够搜索重复的问题...
  • @pavel:您提供的问题不一样,我已经有一个同步块并且该块已同步。但是休眠没有看到新创建的用户。
  • 您正在活动事务下执行同步。当同步块结束时,事务尚未提交(因此进入同步块的其他线程是“没有看到新创建的用户”)。根本问题与链接问题中的完全相同。

标签: java spring hibernate synchronization


【解决方案1】:

您说您的标准结果不正确: 尝试在您的电子邮件上设置 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;
    }

【讨论】:

  • 当我说“没有返回正确的数据”时。这意味着在创建用户之后,当我查询以检查用户是否存在时,它返回 false 但它应该返回 true。
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 2019-11-15
  • 2014-08-14
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多