Hibernate 使用和休眠HQL删除

Hibernate 使用和休眠HQL删除,hibernate,hql,hql-delete,Hibernate,Hql,Hql Delete,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);

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>
我想这很容易,因为到目前为止我觉得一切都很好。我没有得到任何错误或其他任何东西,只是没有删除正在发生


感谢您提供的任何帮助。

uid: 123 and pid: 1
Hibernate: delete from votes where uid=? and pid=?
1
很明显,
query.executeUpdate()
返回1。该方法返回 更新或删除的实体数。这意味着1行已被更新或删除,这是正常的


尝试执行
session.flush()
刷新会话,或执行
session.execute()
从会话中删除对象。

您需要开始并提交事务

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

您还可能需要关闭会话才能在数据库中看到更改。

使用HQL&session.update的完整java代码

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

你怎么知道它没有被删除?您是签入数据库还是在应用程序中执行了另一个查询?直接签入数据库是否为您的应用程序执行插入操作?您是否在某处配置了事务?insert正在工作。我在方法中没有事务。我需要什么//编辑:将完整的方法发布到更清晰的页面。我认为有两件事你可以尝试。一种是将查询中投票的大写字母改为小写(如果您使用的是密钥敏感系统,这可能是问题所在)。您可以尝试的另一件事是在应用程序中执行查询,并在那里检查问题是否是事务。
        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;
        }
        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;