2010-07-25 14 views
13

Dla każdego @Entity muszę wykonać następujące czynności:Jak uzyskać klucz podstawowy dowolnej jednostki 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; 
} 

To utrzymują się podmiot gdyby nie istniał, a wiem, czy to zrobił lub nie istnieje. Z Entity Próbuję osiągnąć @Entity, chociaż zdaję sobie sprawę, że nie jest to związek spadkowy. Jakiej klasy mogę użyć, aby odnieść się do każdej jednostki JPA? Mógłbym po prostu stworzyć interfejs/abstrakcyjną klasę MyEntities i wszystkie z nich odziedziczę, ale czy tak? Mam nadzieję na mniej kodu. Ponadto, spodziewam się, że będę w stanie wyodrębnić klucz podstawowy każdej jednostki, jak próbuję w .getId().

Odpowiedz

36

Ta funkcja została dodana w JPA 2.0. Wystarczy zadzwonić:

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

zgłasza wyjątek wskaźnika pustego –

4

Typowe podejście interfejsu jest tym, czego używam i działa dobrze. Przy użyciu czystego JPA nie widzę sposobu na uzyskanie identyfikatora.

Spójrz na merge(). Nie używałem go dużo siebie, ale myślę

Hibernate ma sposoby robienia tego

Serializable id = session.getIdentifier(entity); 

Ale to nie jest norma JPA.

4

Przeczytaj artykuł o Generic Dao approach.

Nie rozumiem dokładnie twojego problemu, ale jeśli chcesz uzyskać identyfikator podmiotu - po prostu go zdobądź. Jego dostępne po utrzymują metoda jest kompletny tj

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

zwykle zrobić klasę AbstractEntity z pola id i jego dostępowych i dziedziczą wszystkie moje inne podmioty z tej klasy.

Jedynym problemem związanym z tym podejściem jest to, że jeśli konieczne jest udostępnienie Serializable każdej z Twoich jednostek, będziesz musiał dokonać serializacji AbstractEntity, tj. Wszystkie inne jednostki staną się serializowalne. W przeciwnym razie pole id nie zostanie przekształcone do postaci szeregowej w encji, która powinna zostać przekształcona do postaci szeregowej.

1

Innym sposobem pobierania identyfikatorze jednostki jest:

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

Podejście to wykorzystuje extractPrimaryKeyFromObject() metodę z ObjectBuilder klasie.