2010-07-25 8 views
13

aşağıdaki gerçekleştirmeniz gerekir:Herhangi bir JPA varlığının birincil anahtarı nasıl alınır? Her @Entity için

o olmasaydı varlık inat ve öyle de oldu olursa veya mevcut değildir
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; 
} 

. Varlık ile birlikte bir miras ilişkisi olmadığını fark ettiğim halde, @Entity'ye ulaşmaya çalışıyorum. Her JPA varlığına başvurmak için hangi sınıfı kullanabilirim? Sadece bir arayüz/soyut sınıf MyEntities yaratabilirim ve hepsinin mirasını alabilirim, ama bu şekilde mi? Daha az kod umuyorum. Ayrıca, .getId() işlevini denerken, her varlığın birincil anahtarını ayıklayabilmek isterim.

cevap

36

Bu işlevsellik JPA 2.0'a eklenmiştir. Bunun için çağırır:

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

boş bir işaretçi istisnası atar –

4

Genel arabirim yaklaşımı benim kullandığım şey ve iyi çalışıyor. Saf JPA kullanarak tanımlayıcıyı elde etmenin bir yolunu görmüyorum.

merge()'a bakın. Ben çok kendim kullanılmaz ettik ama

hazırda bu

Serializable id = session.getIdentifier(entity); 

yapmanın yollarını olduğunu düşünüyorum Fakat bu JPA standart değil.

4

Generic Dao approach ile ilgili bir yazı okuyun.

Sorununuzu net olarak anlayamıyorum, ancak kimlik kimliğini almak istiyorsanız - hemen edinin. Onun sonra devam kullanılabilir yöntem genellikle alanın id ve erişimcilerle bir sınıf AbstractEntity yapmak ve bu sınıftan tüm diğer varlıkları devralan

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

yani tamamlandı.

Bu yaklaşımla ilgili tek sorun, varlıklarınızdan herhangi birini Seri hale getirmeniz gerekiyorsa, AbstractEntity seri hale getirilebilir olmalıdır, yani diğer tüm varlıklar serileştirilebilir hale gelecektir. Aksi halde id alanı serileştirilmesi gereken kuruluşta serileştirilmeyecektir.

1

işletme numarası getiriliyor bir yolu:

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

Bu yaklaşım extractPrimaryKeyFromObject() ObjectBuilder sınıftan yöntemini kullanır.

İlgili konular