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.
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.
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.
entityManager.createQuery ("DELETE FROM TableName"). executeUpdate ();