2010-07-25 28 views
13

Pour chaque @Entity je besoin d'effectuer les opérations suivantes:Comment obtenir la clé primaire d'une entité 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; 
} 

C'est persister l'entité si elle n'existait pas, et de savoir si elle a ou non exister. Avec Entity, j'essaie d'atteindre @Entity, bien que je réalise que ce n'est pas une relation d'héritage. Quelle classe puis-je utiliser pour faire référence à chaque entité JPA? Je pourrais juste créer une interface/classe abstraite MyEntities et en hériter, mais est-ce le cas? J'espère moins de code. De plus, je m'attendrais à pouvoir extraire la clé primaire de chaque entité, comme je l'ai essayé dans .getId().

Répondre

36

Cette fonctionnalité a été ajoutée dans JPA 2.0. Il suffit d'appeler:

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

déclenche une exception de pointeur null –

4

L'approche d'interface commune est ce que j'utilise et cela fonctionne bien. En utilisant une JPA pure, je ne vois pas comment obtenir l'identifiant.

Jetez un oeil à merge(). Je ne l'ai pas utilisé beaucoup moi-même mais je pense que

Hibernate a les moyens de le faire

Serializable id = session.getIdentifier(entity); 

Mais ce n'est pas la norme JPA.

4

Lire un article sur Generic Dao approach.

Je ne comprends pas clairement votre problème, mais si vous voulez obtenir l'identification de l'entité - il suffit de l'obtenir. Sa méthode après persisteront disponible est complète à savoir

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

Je fais habituellement une classe AbstractEntity avec le champ id et ses accesseurs et héritera de toutes mes autres entités de cette classe.

Le seul problème avec cette approche est que si vous devez rendre l'une de vos entités sérialisable, vous devrez créer AbstractEntity sérialisable, c'est-à-dire que toutes les autres entités deviendront sérialisables. Sinon, le champ id ne sera pas sérialisé dans l'entité qui doit être sérialisable.

1

Une autre façon d'aller chercher l'ID d'entité est:

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

Cette approche utilise extractPrimaryKeyFromObject() méthode de la classe ObjectBuilder.