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);
これまでのところ、すべてが私にとって大丈夫に見えるので、それはかなり簡単なことだと思います。エラーやその他のエラーは発生しませんでした。削除は行われません。
どんな助けも大歓迎です。
トランザクションを開始してコミットする必要があります。
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;
}
変更がデータベースに表示される前にセッションを閉じる必要がある可能性もあります。
指定した出力から
_uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1
_
query.executeUpdate()
が1を返していることは明らかです。このメソッドは、更新または削除されたエンティティの数を返します。これは、1行が更新または削除されたことを意味しますが、問題ありません。
session.flush()
を実行してセッションをフラッシュするか、session.evict()
を実行してセッションからオブジェクトを削除してください。
entityManager.createQuery( "DELETE FROM TableName")。executeUpdate();
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;
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;
}