SORU
22 EKİM 2009, PERŞEMBE


Kullanma zamanı EntityManager.() vs EntityManager.()getReference

Bu EntityManager kullandığım bir durumla karşılaştım garip ama muhtemelen oldukça normal olduğunu düşünüyorum.getReference(LObj.() getClass, LObj.() getİd) bir veritabanı varlık ve döndürülen nesne bir tablo kalıcı geçirmek için.

Yani temelde akışı şöyleydi:

class TFacade{

  createT(FObj, AObj) {
    T TObj = new T();
    TObj.setF(FObj);
    TObj.setA(AObj);
    ...
    EntityManager.persist(TObj);
    ...
    L LObj = A.getL();
    FObj.setL(LObj);
    FFacade.editF(FObj);
  }
}

@TransactionAttributeType.REQUIRES_NEW
class FFacade{

  editF(FObj){
    L LObj = FObj.getL();
    LObj = EntityManager.getReference(LObj.getClass(), LObj.getId());
    ...
    EntityManager.merge(FObj);
    ...
    FLHFacade.create(FObj, LObj);
  }
}

@TransactionAttributeType.REQUIRED
class FLHFacade{

  createFLH(FObj, LObj){
    FLH FLHObj = new FLH();
    FLHObj.setF(FObj);
    FLHObj.setL(LObj);
    ....
    EntityManager.persist(FLHObj);
    ...
  }
}

Aşağıdaki özel durum "java.alıyordum lang.Sınıftır: Bilinmeyen varlık: com.benim.sebat.$$L$3e7987d0$EnhancerByCGLİB"

Bir süre içine baktıktan sonra, nihayet EntityManager kullanıyordum dolayı olduğunu anladım.() getReference yöntemi bir proxy dönüyordu yukarıdaki istisna alıyordum bu yöntem.

Bu beni düşündürüyor,ne zaman EntityManager kullanılması tavsiye edilir.() getReference bu EntityManager yerine.yöntem() yöntem?

EntityManager.() getReference eğer edemezsen varlık kendi içinde çok uygun olduğu için aranan bulursanız bir EntityNotFoundException atar. EntityManager.() yöntemi yalnızca, eğer cant varlık bulamazsa null döndürür.

İşlem sınırları bakımından, kullanmak gerekir gibi geliyor bana bul() ile yeni bir hareket için yeni bulunan bir varlık geçirmeden önce yöntemi. Eğer getReference kullanırsanız() yöntemi, büyük ihtimalle bir durum haricinde benimkine benziyor sona ereceğini.

CEVAP
22 EKİM 2009, PERŞEMBE


Ben çok kullanırımgetReferenceveritabanı durumuna erişmek için ihtiyacım olduğunda yöntem (alıcı yöntem yani). Durumu değiştirmek için (ayarlayıcı yöntemi yani). Senin de bildiğin gibi, getReference güçlü bir özelliği otomatik kirli kontrol aradı kullanan bir proxy nesnesi döndürür. Aşağıdaki varsayalım

public class Person {

    private String name;
    private Integer age;

}


public class PersonServiceImpl implements PersonService {

    public void changeAge(Integer personId, Integer newAge) {
        Person person = em.getReference(Person.class, personId);

        // person is a proxy
        person.setAge(newAge);
    }

}

Eğer ararsambulabilirsinizyöntem, JPA provider, perde arkasında, arayacak

SELECT NAME, AGE FROM PERSON WHERE PERSON_ID = ?

UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?

Eğer ararsamgetReferenceyöntem, JPA provider, perde arkasında, arayacak

UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?

Ve neden biliyor musun ???

GetReference aradığınızda, proxy nesnesi elde edeceksiniz. Böyle bir şey (JPA provider proxy bu uygulama ilgilenir)

public class PersonProxy {

    // JPA provider sets up this field when you call getReference
    private Integer personId;

    private String query = "UPDATE PERSON SET ";

    private boolean stateChanged = false;

    public void setAge(Integer newAge) {
        stateChanged = true;

        query  = query   "AGE = "   newAge;
    }

}

İşlem gerçekleştirmeden önce, JPA provider güncelleme VEYA tüzel kişi için stateChanged bayrağı görecek. Eğer hiçbir satır güncelleştirme deyimi sonra güncelleştirildi, JPA provider JPA özelliklerine göre EntityNotFoundException atmak olacaktır.

saygılar,

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CMTelly

    CMTelly

    2 Mayıs 2007
  • Moodle

    Moodle

    11 Mayıs 2010
  • whatever

    whatever

    30 EYLÜL 2005