JPA'da getOne ve findById arasındaki fark?

Herkese merhabalar, hem findById() hem de getOne() yöntemlerinin arasındaki temel farkları anlatacağım.

Temel olarak veri tabanından veri çekmek için kullanılırlar,

Ancak, kayıtları almanın altında yatan mekanizma bu iki yöntem için de farklıdır.

getOne() methodu

verilen tabloya(nesneye) sahip varlığa bir referans döndürür.

getOne, EntityManager.getReference() yöntemini dahili olarak çağırır.

Buna göre yöntem her zaman veritabanına sorgu çekmeden (var olan istek üzerinden) bir proxy döndürür.

İstenen veri veritabanında yoksa, bu yöntem erişim anında EntityNotFoundException hatasını atar.

findById() method

Bu yöntem aslında veritabanını sorgu çeker ve gerçek nesne eşlemesini veritabanındaki bir satıra döndürür.

Veritabanında kayıt yoksa null döndürür.

Tüm ilişkilerini yüklüyen işlemleri gerçekleştirir.

Hangisini seçmeliyiz?

Bu yöntemler arasındaki tek gerçek fark, performansla ilgilidir.

Tembel olarak yüklenen getOne() yöntemi, döndürülen proxy nesnesinin özelliklerine fiilen erişilene kadar veritabanına asla sorgu çekmez,

JVM’den veritabanı gidiş dönüşünü önler.

Sadece ilişkiyi sürdürmek için (OneToOne veya ManyToOne) veritabanından veri almak ve onu başka bir nesneye referans olarak atamak istediğinizde findbyId kullanışlıdır.

Spring boot ile kod örneği

Post Entitiy

@Entity

@Table(name = “post”,schema = “public”)

@Getter

@Setter

@NoArgsConstructor

@AllArgsConstructor

public class Post implements Serializable{

@SuppressWarnings(“unused”)

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

private Set<PostMeta> postMeta;

….

}

PostMeta Entity

@Entity

@Table(name = “post_meta”,schema = “public”)

@Getter

@Setter

@NoArgsConstructor

@AllArgsConstructor

public class PostMeta {

@SuppressWarnings(“unused”)

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

private Long id;

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)

@JoinColumn(name = “post_id”)

private Post post;

}

service katmanında yazılan sınıf

public PostMetaDto update(Long id, PostMetaDto postMetaDto) {

PostMeta postMetaDb = postMetaRepository.getOne(id);

if (postMetaDb == null) {

throw new IllegalArgumentException(“PostMeta Boş Geçilemez”);

}

postMetaDb = modelMapper.map(postMetaDto, PostMeta.class);

postMetaRepository.save(postMetaDb);

return modelMapper.map(postMetaDb, PostMetaDto.class);

}

@Override

@Transactional

public PostMetaDto update(Long id, PostMetaDto postMetaDto) {

Optional<PostMeta> postMetaDb = postMetaRepository.findById(id);

if (postMetaDb == null) {

throw new IllegalArgumentException(“PostMeta Boş Geçilemez”);

}

İki Metod arasındaki fark tablosunu özet olarak verelim.

Bu ve benzeri yazılarımızı internet sitemizden okuyabilirsiniz.

Referanslar

https://www.javacodemonk.com/difference-between-getone-and-findbyid-in-spring-data-jpa-3a96c3ff

iyi çalışmalar.

https://latestsoftwaredevelopers.hashnode.dev/

https://medium.com/@latestsoftwaredevelopers

https://latestsoftwaredevelopers.com

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Spring Boot ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *