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