Delete do Hibernate muito lento. DeleteById usando HQL

0 respostas
marcellandrade

Olá pessoal. Estou fazendo alguns testes de performance com o Hibernate e reparei que se eu tetar fazer um delete de um objeto somente com id e com todos os outros nulos tenho que fazer um get do objeto para depois deletá-lo. O hibernate faz um select e depois faz um delete. Eu sei que quando os outros campos estão marcados como not-null ele é obrigado a fazer um get do objeto, mas sinceramente eu não entendo o porque disso.Com o hql que estou usando agora ele faz um delete sem select antes, porem é muito lento chegando a quase 2 segundos para um registro apenas. Isso é normal ? Quando mandei deletar todos os 40976 registros ele demorou somente 4 segundos.

protected Session getSession() {
		  
	     return HibernateUtil.getInstance().getSession();
}
 
private Session session

public void deleteText(int id) {
		Session s = getSession();
		try {
			s.createQuery("delete from Text text where text.oldId= :id")
					.setParameter("id", id).executeUpdate();
			s.getTransaction().commit();
		} catch (HibernateException e) {
			s.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			s.close();
		}
	}

Hibernate Util

public class HibernateUtil {

	private static HibernateUtil me;
	private static SessionFactory sessionFactory = getSessionFactory();

	
	protected static SessionFactory getSessionFactory() {
		try {
			
			return new Configuration().configure().buildSessionFactory();
			
		} catch (Exception e) {
			throw new IllegalStateException(
					"Could not locate SessionFactory in JNDI");
		}
	}

	public Session getSession() {
		Session toReturn = sessionFactory.openSession();
		toReturn.beginTransaction();
		return toReturn;
	}

	public static HibernateUtil getInstance() {
		if (me == null) {
			me = new HibernateUtil();
		}
		return me;
	}
Criado 16 de setembro de 2011
Respostas 0
Participantes 1