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

Tap*_*ose 17 java session hibernate

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

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

我的问题是:

  1. 我想删除一个分离对象,我可以使用这个方法,AFAIK会话首先使一个对象从分离中持久化然后执行它的操作.我对吗?
  2. 如果我不确定数据库中是否存在对象,我应该使用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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

好吗?

Ade*_*ari 27

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

这意味着您可以直接传递entitysession.delete(),以删除该对象.此外,您无需检查实体是否存在.如果在数据库中找不到记录,则应该有例外.事实上,我们通常不会真正得到这种情况.我们总是删除一个现有的实体,我的意思是通常的逻辑就是这样; 所以,没必要那样做.你可以这样做,

SomeEntity ent = session.load(SomeEntity.class, '1234');
session.delete(ent);
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做,

SomeEntity ent = new SomeEntity('1234'); // used constructor for brevity
session.delete(ent);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你也可以使用这个版本session.delete(String query),

sess.delete("from Employee e where e.id = '1234'"); // Just found it is deprecated
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用`session.load()`而不是`.get()`来避免获取实体的数据. (2认同)

小智 7

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

    }

}
Run Code Online (Sandbox Code Playgroud)