2017-10-19 1 views
0

Je tente d'exécuter une requête dans Hibernate qui ressemble àmise à jour et une sélection dans Hibernate requête

private void setFailedLogins(String user_id) throws Exception { 

     this.openDBTransaction(); 
     Query query = session.createQuery(
      "UPDATE User SET loginDate= CURRENT_TIMESTAMP, loginAttempts=(SELECT COUNT(*) FROM loginHistory WHERE user_id=:user_id AND response!=:response AND TIMESTAMPDIFF(MINUTE,valTime,CURRENT_TIMESTAMP) <= 30*24*60) WHERE user_id=:user_id" 
       ); 
      query.setParameter("user_id", user_id); 
      query.setParameter("response", "OK"); 
      int result = query.executeUpdate(); 
     this.closeDBTransaction(); 
    } 

loginAttempts comptage est correct, mais alors mettre à jour la requête est mise à jour ne loginAttempts avec cette valeur

supplémentaires informations concernant coup Hibernate

propriétés Hibernate

<property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}</prop> 
      <prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}</prop> 
      <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}</prop> 
      <prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}</prop> 
      <prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}</prop> 

      <!-- Show and print nice SQL on stdout --> 
      <prop key="show_sql">${hibernate.show_sql}</prop> 
      <prop key="format_sql">${hibernate.format_sql}</prop> 
      <prop key="use_sql_comments">${hibernate.use_sql_comments}</prop> 
      <prop key="hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</prop> 
      <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop> 
     </props> 
    </property> 

hibernate.hib_domain_package=com.retro.app.domain 
hibernate.connection.driver_class = com.mysql.jdbc.Driver 
hibernate.connection.url = jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull 
hibernate.connection.username = ****** 
hibernate.connection.password = ****** 
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
hibernate.c3p0.min_size=8 
hibernate.c3p0.max_size=20 
hibernate.c3p0.timeout=300 
hibernate.c3p0.max_statements=40 
hibernate.c3p0.idle_test_period=3000 
hibernate.show_sql=false 
hibernate.format_sql=false 
hibernate.use_sql_comments=false 
hibernate.hbm2ddl.auto=create 

Side note: Quand je change requête à quelque chose de simple comme:

"UPDATE User SET loginDate= CURRENT_TIMESTAMP, loginAttempts=66 WHERE user_id='USER_3000'" 

Update ne prend aucune action sur une base de données.

Une idée?

+0

Avez-vous une transaction ouverte? Si oui, vérifiez que Session.commit() est appel. Sinon, vérifiez comment la propriété AutoCommit est définie, la stratégie par défaut de mise en veille prolongée est false si je ne me trompe pas. –

+0

@BaptisteBeauvais Je ne suis pas sûr à ce sujet car je suis nouveau à Hibernate. Pensé qu'il sera facile car il utilise PDO en PHP – JackTheKnife

+0

Ce n'est pas vraiment plus compliqué, pouvez-vous fournir votre configuration d'hibernation et la méthode complète où vous appelez la requête s'il vous plaît, pour voir si cela confirme ce que je pense. –

Répondre

0

OK. Je l'ai résolu mais je n'ai aucune idée de ce qui est différent.

Solution ci-dessous:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) 
private void setFailedCount(String user_id) throws Exception { 

     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     String hqlUpdate = "UPDATE User SET loginDate= CURRENT_TIMESTAMP, loginAttempts=(SELECT COUNT(*) FROM loginHistory WHERE user_id=:user_id AND response!=:response AND TIMESTAMPDIFF(MINUTE,valTime,CURRENT_TIMESTAMP) <= 30*24*60) WHERE user_id=:user_id"; 
     int updatedEntities = session.createQuery(hqlUpdate) 
       .setParameter("user_id", user_id) 
       .setParameter("response", "OK") 
       .executeUpdate(); 
     tx.commit(); 
     session.close(); 

    }