休眠Session.delete()一个对象(如果存在)

| 在Session类的JavaDoc中,delete方法的描述为:   从数据存储中删除持久性实例。该自变量可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬时实例。 我的问题是: 我想删除一个分离对象,可以使用这种方法吗?AFAIK会话首先使对象从分离中持久化,然后执行其操作。我对吗? 如果不确定数据库中是否存在该对象,是否应该使用Session.get()检查该对象是否为null,然后执行删除操作,或者可以直接使用删除操作? 这是一个代码片段:
public void removeUnallocatedUserIfExits(final long itemId) {
    getHibernateTemplate().execute(new HibernateCallback() {

        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            session.flush();
            session.setCacheMode(CacheMode.IGNORE);
            UnallocatedUser unallocatedUser;
            if ((unallocatedUser = (UnallocatedUser) session.get(UnallocatedUser.class, itemId)) != null) {
                session.delete(unallocatedUser);
            }
            session.flush();
            return null;
        }
    });
}
可以吗     
已邀请:
  或具有   与现有关联的标识符   持续状态 这意味着您可以直接将
entity
传递给
session.delete()
,以删除该对象。此外,您无需检查该实体是否存在。如果在数据库中找不到记录,则应该有一个例外。实际上,我们通常不会真正遇到这种情况。我们总是删除一个现有的实体,我的意思是通常的逻辑就是这样。因此,无需这样做。您可以简单地做到这一点,
SomeEntity ent = session.load(SomeEntity.class, \'1234\');
session.delete(ent);
或者您也可以这样做
SomeEntity ent = new SomeEntity(\'1234\'); // used constructor for brevity
session.delete(ent);
顺便说一句,您也可以使用此版本
session.delete(String query)
sess.delete(\"from Employee e where e.id = \'1234\'\"); // Just found it is deprecated
    
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class DeletePersistentObjectWithHibernate {

public static void main(String[] args) {

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        Session session = sessionFactory.getCurrentSession();

        long id = 2;

        try {
            session.beginTransaction();

            Employee employee = (Employee) session.get(Employee.class, id);

            session.delete(employee);

            session.getTransaction().commit();
        }
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }

    }

}
    
  尝试这个...
public <T> T delete(T t) throws Exception {
    try {
        t = load(t);
        session.delete(t);
        session.flush();
    } catch (Exception e) {
        throw e;
    } finally {
        session.clear();
    }

    return t;
}

public <T> T load(T t) {
    session.buildLockRequest(LockOptions.NONE).lock(t);
    return t;
}
    
刚刚找到了一个更好的解决方案:
Query q = session.createQuery(\"delete Entity where id = X\");
q.executeUpdate();
休眠删除查询     
  我想删除一个分离对象,我可以使用这种方法进行AFAIK会话吗   首先使对象永久脱离分离,然后执行   操作。我对吗? 如果知道要删除的对象的标识符,则可以创建一个实例,并为其设置标识符并将其传递给会话删除方法。该实例将被视为处于分离状态(因为存在关联的标识符),但是它将在内部由Hibernate重新附加到会话,然后再删除。   如果我不确定数据库中对象的存在,应该   我使用Session.get()检查它是否为null,然后   执行删除操作还是可以直接使用删除操作? 如果无法找到要删除的对象,则delete方法将引发StaleObjectException。因此,您可以使用异常处理来决定在这种情况下的处理方法。     
您可以按照以下简单的休眠方式轻松实现,
Session session=getSession();  
String hql = \"delete from Student where classId= :id\"; 
session.createQuery(hql).setString(\"id\", new Integer(id)).executeUpdate();
    

要回复问题请先登录注册