tutorial mvc mediante libro framework español desarrollo books arquitectura aplicaciones hibernate

hibernate - mvc - spring framework pdf español



Hibernate: compruebe si el objeto existe (4)

Supongamos que los objetos de tipo A se almacenan en DB. Así es como cargo uno específico de DB usando hibernate:

org.hibernate.Session session = ...; long id = 1; A obj = session.load(A.class, id);

Si el objeto con id = 1 no existe, obtendré ObjectNotFoundException . ¿Pero hay una manera de verificar si tal objeto existe sin tener que atrapar la excepción? Lo que me gustaría tener es algo así como:

org.hibernate.Session session = ...; long id = 1; boolean exists = session.exists(A.class, id); if(exists){ // do smth..... }

No lo encontré hibernate docs ...


Puedes usar session.get :

public Object get(Class clazz, Serializable id) throws HibernateException

Devolverá nulo si el objeto no existe en la base de datos. Puede encontrar más información en la documentación de la API de Hibernate .


puede usar HQL para verificar la existencia del objeto:

public Boolean exists (DTOAny instance) { Query query = getSession(). createQuery("select 1 from DTOAny t where t.key = :key"); query.setString("key", instance.getKey() ); return (query.uniqueResult() != null); }

El método Hibernates uniqueResult () devuelve null si no se encontraron datos. Al usar HQL puede crear criterios de consulta más complejos.


Hibernar

Solo obtiene la clave para un rendimiento óptimo:

public boolean exists(Class clazz, String idKey, Object idValue) { return getSession().createCriteria(clazz) .add(Restrictions.eq(idKey, idValue)) .setProjection(Projections.property(idKey)) .uniqueResult() != null; }

JPA

Como Hibernate es una implementación de JPA, es posible inyectar un EntityManager. Este método también tiene un buen rendimiento porque extrae la instancia de forma perezosa :

public boolean exists(Class clazz, Object key) { try { return entitymanager.getReference(Entity.class, key) != null; } catch (EntityNotFoundException.class) { return false; } }


Un método un poco simplificado de @Journeycorner

public boolean exists(Class<?> clazz, Object idValue) { return getSession().createCriteria(clazz) .add(Restrictions.idEq(idValue)) .setProjection(Projections.id()) .uniqueResult() != null; }

Este método también puede ser útil. Tenga en cuenta que este método solo se puede usar con los criterios que pueden producir no más de un registro (como Restrictions.idEq() )

public static boolean uniqueExists(Criteria uniqueCriteria) { uniqueCriteria.setProjection(Projections.id()); return uniqueCriteria.uniqueResult() != null; }