web-dev-qa-db-ja.com

Hibernate HQL delete withおよび

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

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

アウトプリント:

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

これまでのところ、すべてが私にとって大丈夫に見えるので、それはかなり簡単なことだと思います。エラーやその他のエラーは発生しませんでした。削除は行われません。

どんな助けも大歓迎です。

17
user1671980

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

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

変更がデータベースに表示される前にセッションを閉じる必要がある可能性もあります。

35
Bantak

指定した出力から

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

query.executeUpdate()が1を返していることは明らかです。このメソッドは、更新または削除されたエンティティの数を返します。これは、1行が更新または削除されたことを意味しますが、問題ありません。

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

1
Raul Rene

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

0
        int deletedRows = 0;
        try {
            session = sessionProvider.get();
            String hql = "delete from ApprovalRemark approvalRemark where approvalRemark.approvalItem.id =:approvalItemId ";
            Query query = session.createQuery(hql);
            query.setParameter("approvalItemId", approvalItemId);
            deletedRows = query.executeUpdate();
        } catch (javax.persistence.NoResultException e) {
            return false;
        } catch (HibernateException he) {
            log.error("deleteAllApprovalRemarksForApprovalItem exception", he);
            throw he;
        }
        log.debug("deleteAllApprovalRemarksForApprovalItem deleted " + deletedRows + " rows");
        return true;
0

full Java HQLとsession.updateを使用したコード

        try {

            try (Session session = this.sessionFactory.openSession()) {

                session.beginTransaction();

                String hql = "UPDATE Employee SET " +
                        "firstName = :firstName, " +
                        "lastName = :lastName," +
                        "gender = :gender," +
                        "jobTitle = :jobTitle," +
                        "departmentId = :departmentId " +
                        "where employeeId = :employeeId";

                Query query = session.createQuery(hql);

                query
                        .setParameter("employeeId", employee.getEmployeeId())
                        .setParameter("departmentId", employee.getDepartmentId())
                        .setParameter("firstName", employee.getFirstName())
                        .setParameter("lastName", employee.getLastName())
                        .setParameter("gender", employee.getGender())
                        .setParameter("jobTitle", employee.getJobTitle())
                ;

                int rows = query.executeUpdate();

//              session.update(Objects.requireNonNull(employee));

                session.getTransaction().commit();

                return session.get(Employee.class, employee.getEmployeeId()).equals(employee);
            }

        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        }
0