2012-11-21 79 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();