2010-07-25 26 views
13

Por cada @Entity que necesitan para llevar a cabo lo siguiente:¿Cómo obtener la clave principal de cualquier entidad JPA?

public <Entity> boolean insert(final Entity entity){ 
    if (em.find(entity.getClass(), entity.getId()) == null) { 
     et.begin(); 
     em.persist(entity); 
     et.commit(); 
     return true; 
    } 
    return false; 
} 

Eso es persistir la entidad si no existiera, y saber si lo hizo o no existe. Con Entity intento llegar a @Entity, aunque me doy cuenta de que no es una relación de herencia. ¿Qué clase puedo usar para referirme a cada entidad JPA? Podría simplemente crear una clase de interfaz/abstracta MyEntities y heredar todas, pero ¿es así? Estoy esperando por menos código. Además, espero poder extraer la clave primaria de cada entidad, cuando intento en .getId().

Respuesta

36

Esta funcionalidad se ha agregado en JPA 2.0. Simplemente llame:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity); 
+0

arroja una excepción de puntero nulo –

4

El enfoque de interfaz común es el que uso y funciona bien. Usando JPA puro, no veo una forma de obtener el identificador.

Eche un vistazo a merge(). No he utilizado mucho a mí mismo, pero creo que

Hibernate tiene maneras de hacer esto

Serializable id = session.getIdentifier(entity); 

Pero esto no es estándar JPA.

4

Lea un artículo sobre Generic Dao approach.

No entiendo claramente su problema, pero si desea obtener la identificación de la entidad, solo consígalo. Su disponible después de persistir método es completa, es decir

em.persist(entity); 
et.commit(); 
int id = entity.getId() 

Normalmente suelo hacer una clase AbstractEntity con el campo id y sus descriptores de acceso y heredar todas mis otras entidades de esta clase.

El único problema con este enfoque es que si necesita hacer que cualquiera de sus entidades sea serializable, tendrá que hacer AbstractEntity serializable, es decir, todas las demás entidades serán serializables. De lo contrario, el campo id no se serializará en la entidad, que debería ser serializable.

1

Otra forma de ir a buscar ID entidad es:

Session session = entityManager.unwrap(Session.class); 
Object entityId = session.getId(entity); 

Este enfoque utiliza extractPrimaryKeyFromObject() método de la clase ObjectBuilder.

Cuestiones relacionadas