web-dev-qa-db-fra.com

Hibernate HQL supprimer avec et

Hibernate ne supprime pas ma ligne:

public boolean deleteVote(Login user, int pid){

      Session session = getSession();

      try{
          String hql = "delete from Vote where uid= :uid AND pid= :pid";
          Query query = session.createQuery(hql);
          System.out.println(user.getUid() + " and pid: " + pid);
          query.setString("uid", user.getUid());
          query.setInteger("pid", pid);
          System.out.println(query.executeUpdate());
      }catch(Exception e){

Outprint:

uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1

La syntaxe SQL fonctionne lorsque j'essaie directement en SQL. Syntaxe Direct SQL:

 delete from votes where uid= '123' AND pid= 1

Cartographie:

<class name="package.model.Vote" table="votes">
   <id name="vid" column="vid" >
   <generator class="increment"/>
</id>
<property name="pid" column="pid" />
<property name="uid" column="uid" />
<property name="tid" column="tid" />
<property name="votes" column="votes" />
 </class>

Table:

CREATE TABLE IF NOT EXISTS `votes` (
  `vid` int(11) NOT NULL 
  `pid` int(11) NOT NULL,
  `uid` varchar(20) NOT NULL,
  `tid` int(11) NOT NULL,
  `votes` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`vid`),
  KEY `pcid` (`pid`,`uid`),
  KEY `uid` (`uid`),
  KEY `tid` (`tid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

ALTER TABLE `votes`
ADD CONSTRAINT `votes_ibfk_3` FOREIGN KEY (`pid`) REFERENCES `poll` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `votes_ibfk_4` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON     UPDATE CASCADE,
ADD CONSTRAINT `votes_ibfk_5` FOREIGN KEY (`tid`) REFERENCES `teams` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE;

INSERT INTO `votes` (`vid`, `pid`, `uid`, `tid`, `votes`) VALUES
(20, 1, '123', 1, 1);

Je suppose que c'est quelque chose d'assez facile car tout me semble aller jusqu'à présent. Je n'ai aucune erreur ou autre chose, juste qu'il n'y a pas de suppression en cours.

Toute aide est appréciée.

15
user1671980

Vous devez commencer et valider une transaction.

Transaction transaction = session.beginTransaction();
try {
  // your code
  String hql = "delete from Vote where uid= :uid AND pid= :pid";
  Query query = session.createQuery(hql);
  System.out.println(user.getUid() + " and pid: " + pid);
  query.setString("uid", user.getUid());
  query.setInteger("pid", pid);
  System.out.println(query.executeUpdate());
  // your code end

  transaction.commit();
} catch (Throwable t) {
  transaction.rollback();
  throw t;
}

Il est également possible que vous deviez fermer la session avant que les modifications ne soient visibles dans la base de données.

32
Bantak

De la sortie que vous avez fournie 

uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1

il est clair que query.executeUpdate() renvoie 1. La méthode renvoie .__ le nombre d'entités mises à jour ou supprimées. Cela signifie qu'une ligne a été mise à jour ou supprimée, ce qui est correct.

Essayez d'effectuer une session.flush() pour vider la session ou une session.evict() pour supprimer l'objet de la session.

1
Raul Rene

entityManager.createQuery ("DELETE FROM TableName"). executeUpdate ();

0
Takhir Atamuratov