9 Kasım 2020 Pazartesi

SpringData JpaRepository Arayüzü ve EntityManager İlişkisi

Giriş
Bu sınıf altta EntityManager nesnesini kullanır. Dolayısıyla " JPA Entity Lifecycle" geçerlidir.

Döndürülen Nesneler
Halen EntityManager'a bağlıdırlar.

Örnek
Not : Bu örnekteki custom metodu anlamak için JpaRepository İle Custom Method yazısına bakabilirsiniz.

Elimizde şöyle bir kod olsun
public interface UserRepository extends JpaRepository<User, Long> {
}
Bu kodu şöyle kullanalım. Bu kod 1 noktasında yüklenen nesneyi 2 noktasında değiştiriyor. Daha sonraki noktalarda yapılan save() işlemleri de yan etki olarak 2 noktasındaki kirli nesneyi de kaydediyor.
public void updateUser(int id, String name, int changeReqId){
  User mUser = userRepository.findOne(id); //1
  mUser.setName(name); //2

  ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
  ChangeResponse rs = userWebService.updateDetails(mUser); //3

  if(rs.isAccepted()){
    userRepository.saveAndFlush(mUser); //4
  }

  cr.setResponseCode(rs.getCode());
  changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}
Düzeltmek için şöyle yaparız. Böylece nesneyi istendiği durumda EntityManager'dan ayırmak mümkün olur.
public interface UserRepositoryCustom {
    ...
   void detachUser(User u);
    ...
}

public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
    ...
}

@Repository
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    ...
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void detachUser(User u) {
        entityManager.detach(u);
    }
    ...
}

Hiç yorum yok:

Yorum Gönder