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

时间:2011-04-25 07:08:12

标签: java hibernate session

在Session类的JavaDoc中,delete方法的描述是:

  

从数据存储中删除持久性实例。参数可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬态实例。

我的问题是:

  1. 我想删除一个分离对象,我可以使用这个方法,AFAIK会话首先使一个对象从分离中持久化,然后执行它的操作。我对吗?
  2. 如果我不确定数据库中是否存在对象,我应该使用Session.get()来检查它是否为null然后执行删除操作或者我可以直接使用删除操作吗?
  3. 以下是代码段:

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

    好吗?

7 个答案:

答案 0 :(得分:26)

  

或带有的瞬态实例   与现有关联的标识符   持久状态

这意味着您可以直接将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

答案 1 :(得分:6)

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

    }

}

答案 2 :(得分:3)

  

试试这个......

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

答案 3 :(得分:3)

找到了一个更好的解决方案:

Query q = session.createQuery("delete Entity where id = X");
q.executeUpdate();

Hibernate Delete query

答案 4 :(得分:1)

  

我想删除一个分离对象,我可以使用这个方法,AFAIK会话   首先使一个对象从分离中持久化,然后执行它   操作。我是对的吗?

如果您知道要删除的对象的标识符,则可以创建一个设置了其标识符的实例,并将其传递给会话删除方法。此实例将被视为处于分离状态(因为存在关联的标识符),但是它将在内部通过Hibernate重新连接到会话,然后删除。

  

如果我不确定数据库中是否存在对象,应该   我使用Session.get()来检查它是否为null然后   执行删除操作还是我可以直接删除操作?

如果找不到要删除的对象,delete方法将抛出StaleObjectException。因此,您可以使用异常处理来决定在这种情况下要做什么。

答案 5 :(得分:1)

您可以通过以下简单的休眠方式轻松实现,

Session session=getSession();  
String hql = "delete from Student where classId= :id"; 
session.createQuery(hql).setString("id", new Integer(id)).executeUpdate();

答案 6 :(得分:0)

休眠本地查询示例如下。

import org.hibernate.query.nativeQuery;  

String sql = "Delete from Student where classId= :id"; 
NativeQuery query = session.createNativeQuery(sql.toString()); 
query.executeUpdate();