2012-11-21 14 views
12

Hibernateは私の行を削除しません:HibernateはHQLはして削除して

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 

私はSQLに直接しようとしている時にSQL構文が働いています。直接SQL構文:

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

マッピング:

<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> 

表:

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); 

私はすべてがこれまでに私のために大丈夫に見えるので、それは非常に簡単なものだと思います。私はエラーや何か他に何も起こっていない、ちょうど削除が起こっていないこと。

何か助けていただければ幸いです。

+0

削除されていないことをどのように知っていますか?データベースをチェックインしましたか、アプリケーションで別のクエリを実行しましたか? – fiso

+0

データベースに直接チェックされています – user1671980

+0

あなたのインサートは使えますか?どこかでトランザクションを設定していますか? –

答えて

28

トランザクションを開始してコミットする必要があります。

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; 
} 

変更をデータベースに表示するには、セッションを閉じる必要があります。

1

あなたは

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

を提供出力から、query.executeUpdate()は1を返す方法は エンティティ更新または削除の数を返すことは明らかです。これは、1行が更新または削除されたことを意味します。これは問題ありません。

session.flush()を実行してセッションをフラッシュするか、session.evict()を実行してセッションからオブジェクトを削除してみてください。

1

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

関連する問題