2010-07-25 17 views
13

Für jeden @Entity Ich brauche die folgenden auszuführen:Wie erhält man den Primärschlüssel einer beliebigen JPA-Entität?

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; 
} 

Das heißt beharren die Person, wenn sie nicht vorhanden, und wissen, ob es existiert hat oder nicht. Mit Entity versuche ich @Entity zu erreichen, obwohl mir klar ist, dass es sich nicht um eine Erbschaftsbeziehung handelt. Mit welcher Klasse kann ich auf jede JPA-Entität verweisen? Ich könnte einfach eine Schnittstelle/abstrakte Klasse MyEntities erstellen und sie alle erben lassen, aber ist das so? Ich hoffe auf weniger Code. Außerdem würde ich erwarten, in der Lage zu sein, den Primärschlüssel jeder Entität zu extrahieren, wie ich in .getId() versuche.

Antwort

36

Diese Funktionalität wurde in JPA 2.0 hinzugefügt. Rufen Sie einfach:

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

löst eine Nullzeigerausnahme aus –

4

Der Common-Interface-Ansatz ist, was ich verwende und es funktioniert gut. Mit reinem JPA sehe ich keine Möglichkeit, den Bezeichner zu erhalten.

Werfen Sie einen Blick auf merge(). Ich habe es nicht viel selbst verwendet, aber ich denke,

Hibernate hat Möglichkeiten dies zu tun

Serializable id = session.getIdentifier(entity); 

Aber das ist nicht JPA-Standard.

4

Lesen Sie einen Artikel über Generic Dao approach.

Ich verstehe nicht klar Ihr Problem, aber wenn Sie Entitäts-ID bekommen wollen - nur bekommen. Sein vorhandenes nach persistieren Verfahren abgeschlossen ist d

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

ich in der Regel eine Klasse AbstractEntity mit Feld von dieser Klasse id und seine Zugriffs- und erben alle meine anderen Einheiten machen.

Das einzige Problem bei diesem Ansatz ist, dass wenn Sie Ihre Entitäten serialisierbar machen müssen, müssen Sie AbstractEntity serialisierbar machen, d. H. Alle anderen Entitäten werden serialisierbar. Andernfalls wird das Feld id in der Entität, die serialisierbar sein soll, nicht serialisiert.

1

Eine weitere Möglichkeit, Einheit ID des Abrufens ist:

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

Dieser Ansatz verwendet extractPrimaryKeyFromObject() Methode von ObjectBuilder Klasse.

Verwandte Themen