2014-09-05 75 views
0

我正在嘗試在調用函數時創建用戶(在同步塊中)。當有多個並行調用時,即使用戶已經在同步塊中創建,它也會創建具有相同emailId的多個用戶。Java Spring-Hibernate同步數據庫更新問題

請注意,我的數據庫中的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

這是在一個trasaction中做同步的很常見的錯誤。我很確定我將能夠搜索重複的問題... – 2014-09-05 19:48:33

+0

@水平:你提供的問題是不一樣的,我已經有一個同步塊和塊是同步的。但是hibernate沒有看到新創建的用戶。 – cldy1020 2014-09-05 23:07:52

+0

您正在執行活動事務下的同步。當同步塊結束時,事務還沒有被提交(因此進入同步塊的其他線程是*「看不到新創建的用戶」*)。根本問題與鏈接問題完全相同。 – 2014-09-05 23:32:43

回答

0

你說你是從你的標準得到不正確的結果: 試試您的電子郵件設置uniqueResult如果空是由條件返回,這意味着與電子郵件用戶不存在於數據庫中:

User user =(User)session.createCriteria(User.class) 
     .add(Restrictions.eq("emailId",email) 
     .setMaxResults(1) 
     .uniqueResult(); 

    if(user!=null){ 
    isExist=true; 
} 
else{ 
     isExist=false; 
    } 
+0

當我說「沒有返回正確的數據」。這意味着在創建用戶之後,當我查詢用戶是否存在時,它返回false,但它應該返回true。 – cldy1020 2014-09-05 23:09:23