2009-07-16 16 views
35

, esasen nesne zaten gerekirse olarak itiraz güncelleştirmeleri veritabanında mevcut ve ya olmadığına bakar ya yeni bir örneğini kaydeder Hazırda en saveOrUpdate behavior çoğaltmak herhangi bir yolu,Hibernate'in saveOrUpdate'ını JPA'da nasıl kopyalayabilirsiniz? JPA içinde

saveOrUpdate 

public void saveOrUpdate(Object object) 
        throws HibernateException 

    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking). 

    This operation cascades to associated instances if the association is mapped with cascade="save-update". 

    Parameters: 
     object - a transient or detached instance containing new or updated state 
    Throws: 
     HibernateException 
    See Also: 
     save(Object), update(Object) 

var nesne.

JPA transkriptiz okumalar güzel, ancak bu yöntemi Hibernate'den gerçekten özlüyorum. Deneyimli JPA geliştiricileri bunu nasıl ele alır?

+0

"Ana anahtar" ın boş olup olmadığını kontrol etme nedir? –

cevap

27

EntityManager.merge yöntemini kullanmayı deneyin - bu çok benzer.

Xebia'nın blog sunucusundaki farklılıkların mükemmel bir açıklaması var: "JPA Implementation Patterns: Saving (Detached) Entities."

+6

Burada benim için büyük bir paket var: "Var olan bir varlığı güncellerken, herhangi bir EntityManager yöntemini çağırmıyoruz; JPA sağlayıcısı veri tabanını otomatik olarak temizleme veya teslim etme zamanında güncelleyecektir." –

+1

Bağlantı öldü. İşte yeni bir tane: http://blog.xebia.com/jpa-implementation-patterns-saving-detached-entities/ – Dmitry

5

Pablojim'in bağlandığı makalede anlatılan yöntemle ilgili sorun, otomatik oluşturulan birincil anahtarları çok iyi işlememesidir.

Yeni bir ORM varlık nesnesinin oluşturulmasını düşünün, bunu veritabanı tablosundaki varolan bir satır ile aynı verileri verebilirsiniz, ancak hatalı olduğum sürece, varlık yöneticisi bunları sahipleninceye kadar aynı satır olarak tanımaz. Otomatik oluşturulan anahtarları kullanan bir varlıktaki aynı birincil anahtar, veritabanına gidene kadar ulaşamazsınız.

İşte benim şu anki durumum bu durum için;

/** 
* Save an object into the database if it does not exist, else return 
* object that exists in the database. 
* 
* @param query query to find object in the database, should only return 
* one object. 
* @param entity Object to save or update. 
* @return Object in the database, whither it was prior or not. 
*/ 
private Object saveOrUpdate(Query query, Object entity) { 
    final int NO_RESULT = 0; 
    final int RESULT = 1; 

    //should return a list of ONE result, 
    // since the query should be finding unique objects 
    List results = query.getResultList(); 
    switch (results.size()) { 
     case NO_RESULT: 
      em.persist(entity); 
      return entity; 
     case RESULT: 
      return results.get(0); 
     default: 
      throw new NonUniqueResultException("Unexpected query results, " + 
        results.size()); 
    } 
} 
+1

birleştirme ve saveOrUpdate yüzeysel olarak benzer ama aynı değil. Semantiğin önemli farklılıkları vardır. – skaffman

+0

@skaffman, yaklaşımımın kusurlu olduğunu mu düşünüyorsun? Varsa bazı yapıcı eleştirilerimi yollayabilir misin? Ben bu JPA şeyleri için ormanda bir bebeğim. –

+0

Bu eski parçacığı buldum ve yeni Java ENUMS haricinde bu çözüm gibi bir şey uyguluyorum. Teşekkürler. – oberger