Hibernate Session.delete () объект, если существует - PullRequest
17 голосов
/ 25 апреля 2011

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

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

Мои вопросы:

  1. Я хочу удалить объект отсоединения, могу ли я использовать этот метод, сеанс AFAIK сначала делает объект постоянным для отсоединения, а затем выполняет его операцию. Я прав?
  2. Если я не уверен в существовании объекта в базе данных, должен ли я использовать 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;
        }
    });
}

Все в порядке?

Ответы [ 6 ]

26 голосов
/ 25 апреля 2011

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

Это означает, что вы можете напрямую передать 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
6 голосов
/ 02 апреля 2015
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 голосов
/ 31 декабря 2014

Только что нашли лучшее решение:

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

Запрос на удаление Hibernate

3 голосов
/ 25 февраля 2013

Попробуйте это ...

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;
}
1 голос
/ 01 сентября 2014

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

Session session=getSession();  
String hql = "delete from Student where classId= :id"; 
session.createQuery(hql).setString("id", new Integer(id)).executeUpdate();
1 голос
/ 10 сентября 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...