Hibernate Session.delete() объект, если существует

В классе JavaDoc класса Session описание метода delete:

Удалите постоянный экземпляр из хранилища данных. Аргумент может быть экземпляром, связанным с принимающим сеансом или временным экземпляром с идентификатором, связанным с существующим постоянным состоянием.

Мои вопросы:

  • Я хочу удалить выделенный объект, я могу использовать этот метод, сессия AFAIK сначала делает объект постоянным от отсоединения, а затем выполняет его работу. Я прав?
  • Если я не уверен в существовании объекта в базе данных, должен ли я использовать Session.get(), чтобы проверить, является ли оно нулевым, а затем выполнить операцию удаления или я могу использовать операцию прямого удаления?

Вот фрагмент кода:

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

Хорошо?

Ответ 1

или временный экземпляр с идентификатор, связанный с существующим постоянное состояние

Это означает, что вы можете передать ваш 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);

Btw, вы также можете использовать эту версию session.delete(String query),

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

Ответ 2

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

    }

}

Ответ 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;
}

Ответ 4

Просто найдено одно лучшее решение:

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

Hibernate Удалить запрос

Ответ 5

Я хочу удалить выделенный объект, могу ли я использовать этот метод, сеанс AFAIK сначала делает объект постоянным от отсоединения, а затем выполняет операция. Я прав?

Если вам известен идентификатор объекта, который вы хотите удалить, вы можете создать экземпляр с его набором идентификаторов и передать его методу удаления сеанса. Этот экземпляр будет считаться находящимся в состоянии отсоединения (поскольку существует связанный с ним идентификатор), однако он будет повторно привязан к сеансу с помощью Hibernate и затем удален.

Если я не уверен в существовании объекта в базе данных, Я использую Session.get(), чтобы проверить, является ли оно нулевым, а затем выполнить операцию удаления или я могу использовать операцию прямого удаления?

Метод delete будет вызывать StaleObjectException, если он не может найти объект, который нужно удалить. Поэтому вы можете использовать обработку исключений, чтобы решить, что делать в этом случае.

Ответ 6

Вы можете легко достичь, выполнив простой спящий режим следующим образом:

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