Örnek 1: Spring Data JPA Repository
java
Copy code
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
Yukarıdaki örnekte, UserRepository adında bir JPA Repository oluşturduk. Bu, veritabanındaki User nesneleri üzerinde CRUD işlemleri gerçekleştirmemizi sağlar.
Örnek 2: Spring Data JPA ile Entity Sınıfı
java
Copy code
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
// getter ve setter metodları...
}
Yukarıdaki örnekte, User adında bir JPA Entity sınıfı oluşturduk. Bu sınıf, veritabanındaki bir tabloyu temsil eder.
Örnek Soru 1: Spring Data JPA nedir ve ne işe yarar?
Cevap: Spring Data JPA, Java Persistence API (JPA) üzerinde kurulu bir kütüphanedir. Bu, veritabanı erişimi ve ORM gibi işlemleri kolaylaştırır. CRUD işlemlerini basitleştiren ve query oluşturma ihtiyacını azaltan standart repository'leri ve yarı otomatik JPA sorgu oluşturma yeteneklerini sağlar.
Örnek Soru 2: Spring Data JPA ve Hibernate arasındaki farklar nelerdir?
Cevap: Hibernate, bir ORM (Object Relational Mapping) aracıdır ve JPA (Java Persistence API) spesifikasyonunun bir uygulamasıdır. Diğer taraftan, Spring Data JPA, veritabanı erişimini basitleştirmek için tasarlanmış bir Spring modülüdür ve Hibernate dahil olmak üzere çeşitli JPA uygulamaları ile kullanılabilir. Spring Data JPA, Hibernate veya başka bir JPA uygulaması üzerinde çalışırken CRUD işlemlerini ve sorgu oluşturmayı daha basit hale getirir.
Örnek Soru 3: Spring Data JPA'da @Repository annotation'ının rolü nedir?
Cevap: @Repository annotation'ı, bir sınıfın veritabanı işlemleri için kullanılabilecek bir DAO (Data Access Object) olduğunu belirtir. Bu annotation, Spring'e bu sınıfın veritabanı işlemlerini otomatikleştirmek için kullanılması gerektiğini bildirir. Bu ayrıca, veritabanı işlemleri sırasında hata işleme gibi bazı otomatik işlemleri de etkinleştirir.
Örnek 3: Custom Query ile Spring Data JPA Repository
java
Copy code
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
}
Yukarıdaki örnekte, UserRepository adında bir JPA Repository oluşturduk ve @Query annotation'ı kullanarak custom bir sorgu yazdık.
Örnek 4: Spring Data JPA ile Veri Kaydetme
java
Copy code
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(User user) {
return userRepository.save(user);
}
}
Bu örnekte, bir User oluşturup veritabanına kaydetmek için bir service sınıfı oluşturduk. UserRepository'nin save() metodunu kullanarak bu işlemi gerçekleştirdik.
Örnek Soru 4: Spring Data JPA'da @Query annotation'ı nasıl kullanılır?
Cevap: @Query annotation'ı, bir repository metodu üzerinde custom bir SQL veya JPQL sorgusu tanımlamak için kullanılır. Bu, otomatik query generation'ın karşılayamadığı daha karmaşık sorgulama ihtiyaçlarını karşılamak için kullanılır.
Örnek Soru 5: Spring Data JPA ile CrudRepository ve JpaRepository arasındaki farklar nelerdir?
Cevap: Hem CrudRepository hem de JpaRepository, CRUD işlemlerini destekler. Ancak, JpaRepository daha fazla özellik sunar. Örneğin, JpaRepository flush() ve saveAndFlush() gibi işlemleri destekler ve PagingAndSortingRepository'den türetilmiştir, bu da paginated ve sorted sonuçları almak için metotlar sunar. CrudRepository, genel amaçlı CRUD işlemleri için daha basit ve minimalist bir alternatiftir.
Örnek Soru 6: Spring Data JPA'da Lazy ve Eager loading arasındaki fark nedir?
Cevap: Lazy ve Eager loading, ilişkili verinin ne zaman yükleneceğini belirler. Eager loading, ana entity yüklendiğinde ilişkili entity'lerin de hemen yüklenmesini sağlar. Lazy loading ise, ilişkili entity'nin yalnızca kullanıldığı zaman yüklenmesini sağlar. Bu, genellikle performansı artırmak için kullanılır, çünkü tüm ilişkili verinin her zaman gerekli olmadığı durumlarda gereksiz veri yüklemeyi önler.
Örnek 5: Spring Data JPA ile Veri Güncelleme
java
Copy code
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User updateUser(User user) {
User existingUser = userRepository.findById(user.getId())
.orElseThrow(() -> new ResourceNotFoundException("Kullanıcı bulunamadı ID: " + user.getId()));
existingUser.setUsername(user.getUsername());
existingUser.setPassword(user.getPassword());
return userRepository.save(existingUser);
}
}
Bu örnekte, bir User'ı güncellemek için bir service sınıfı oluşturduk. Önce mevcut kullanıcıyı bulduk ve ardından verileri güncelledik ve UserRepository'nin save() metodunu kullanarak bu güncellemeyi veritabanına yansıttık.
Örnek 6: Spring Data JPA ile Veri Silme
java
Copy code
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
Bu örnekte, bir User'ı silmek için bir service sınıfı oluşturduk. UserRepository'nin deleteById() metodunu kullanarak bu işlemi gerçekleştirdik.
Örnek Soru 7: Spring Data JPA'da Entity Sınıfları ve Repository Sınıfları arasındaki ilişki nedir?
Cevap: Entity sınıfları, veritabanındaki tabloları temsil eder. Bu sınıflar, veritabanında her bir tablo satırını bir Java objesi olarak temsil etmek için kullanılır. Öte yandan, Repository sınıfları, bu Entity sınıflarının bir örneğinin veritabanında nasıl oluşturulacağını, güncelleneceğini, alınacağını ve silineceğini belirler. Yani, Entity sınıflar, verinin neye benzediğini belirlerken, Repository sınıflar bu verinin nasıl işleneceğini belirler.
Örnek Soru 8: Spring Data JPA'da Pagination nasıl yapılır?
Cevap: Spring Data JPA'da Pagination, PagingAndSortingRepository'yi veya JpaRepository'yi extend ederek yapılır. Bu repository'ler findAll(Pageable pageable) adında bir metod sunar. Bu metod, bir Pageable nesne alır ve bir Page nesne döndürür. Pageable nesnesi, hangi sayfanın ve sayfa başına kaç kaydın istendiğini belirtmek için kullanılır. Sonuç olarak dönen Page nesnesi, istenen sayfadaki kayıtları ve ek bilgileri (toplam sayfa sayısı, toplam kayıt sayısı, vb.) içerir.
Örnek 7: Spring Data JPA ile Pagination
java
Copy code
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public Page<User> findPaginated(int pageNo, int pageSize) {
Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
return userRepository.findAll(pageable);
}
}
Bu örnekte, findPaginated adında bir metod oluşturduk. Bu metod, belirtilen sayfa numarası ve sayfa başına düşen kayıt sayısına göre sonuçları döndürür. userRepository'nin findAll() metoduna bir Pageable nesne geçirerek bu işlemi gerçekleştirdik.
Örnek Soru 9: Spring Data JPA'da Derived Query nedir?
Cevap: Derived Query, metod isminden query oluşturma anlamına gelir. Spring Data JPA, metod isimlerini analiz eder ve bu isimlerden sorguları türetir. Örneğin, findByUsername(String username) metodunda Spring Data JPA, username alanında belirtilen değere eşit olan User'ları bulacak bir sorgu türetir.
Örnek Soru 10: Spring Data JPA'da Transactional ne anlama gelir?
Cevap: @Transactional anotasyonu, işlem yönetimini etkinleştirir. Bu anotasyon bir metoda uygulandığında, Spring, o metodun başında yeni bir işlem başlatır veya var olan bir işlemi devam ettirir ve metod tamamlandığında işlemi otomatik olarak commit eder ya da bir exception durumunda işlemi geri alır. Bu sayede, veritabanı işlemlerinin atomic (bütünsel) olarak çalışmasını sağlar.
Örnek Soru 11: @Entity ve @Table anotasyonları arasındaki fark nedir?
Cevap: @Entity anotasyonu, bir sınıfın JPA Entity olduğunu belirtir, yani veritabanında bir tabloyu temsil eder. @Table anotasyonu ise, bir entity'nin hangi veritabanı tablosuyla ilişkilendirileceğini belirtir. Eğer @Table anotasyonu belirtilmezse, entity sınıfı adı tablo adı olarak kullanılır. @Table anotasyonu, tablo adının yanı sıra schema adı, catalog adı ve tablo kısıtlamaları gibi ek parametreler de belirlememize olanak sağlar.
Örnek 8: Spring Data JPA ile Tek Bir Entity'nin Bulunması
java
Copy code
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Kullanıcı bulunamadı ID: " + id));
}
}
Bu örnekte, bir User'ı ID'ye göre bulmak için bir service sınıfı oluşturduk. UserRepository'nin findById() metodunu kullanarak bu işlemi gerçekleştirdik.
Örnek Soru 12: Spring Data JPA'da @Entity annotation'ı nasıl kullanılır?
Cevap: @Entity anotasyonu, bir sınıfın JPA Entity olduğunu belirtir. Bu anotasyonu taşıyan sınıflar, veritabanında bir tabloyu temsil eder ve JPA tarafından yönetilir. Bu sınıfların her bir örneği genellikle veritabanında bir tablo satırını temsil eder.
Örnek Soru 13: Spring Data JPA'da @Id annotation'ı ne işe yarar?
Cevap: @Id anotasyonu, bir entity sınıfındaki bir alanın, o entity'nin birincil anahtarı olduğunu belirtir. Bir entity sınıfında tam olarak bir @Id alanı olmalıdır. Bu alan, entity'nin yaşam döngüsü boyunca benzersiz ve sabit olmalıdır.
Örnek Soru 14: Spring Data JPA'da @GeneratedValue annotation'ı ne işe yarar?
Cevap: @GeneratedValue anotasyonu, birincil anahtar değerlerinin nasıl otomatik olarak oluşturulacağını belirtir. Bu anotasyonun strategy özelliği ile oluşturma stratejisi belirlenebilir. Örneğin, @GeneratedValue(strategy = GenerationType.AUTO) kullanıldığında, JPA sağlayıcısı (örneğin Hibernate), birincil anahtar değerini otomatik olarak oluşturur. Diğer stratejiler IDENTITY, SEQUENCE ve TABLE gibi değerler içerir.
Örnek Soru 15: Spring Data JPA'da @Column annotation'ı ne işe yarar?
Cevap: @Column anotasyonu, bir entity sınıfındaki bir alanın hangi veritabanı sütunu ile eşleşeceğini belirtir. Bu anotasyonu kullanarak, sütun adı, tipi, boyutu, nullable olup olmadığı ve diğer sütun özellikleri gibi detayları belirleyebiliriz. @Column anotasyonu kullanılmazsa, alan adı varsayılan sütun adı olarak kabul edilir.
Örnek 9: Spring Data JPA'da Veri Sorgulama için Derived Query Kullanımı
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUsername(String username);
List<User> findByEmailAndActiveTrue(String email);
}
Bu örnekte UserRepository adında bir JPA Repository oluşturduk ve metod isimlerinden sorgu oluşturduk. findByUsername metodu, username'e göre User'ları bulacaktır. findByEmailAndActiveTrue metodu ise, belirtilen e-postaya sahip ve aktif olan User'ları bulacaktır.
Örnek Soru 16: Spring Data JPA'da @OneToOne, @OneToMany, @ManyToOne ve @ManyToMany anotasyonları ne anlama gelir?
Cevap: Bu anotasyonlar, entity sınıfları arasındaki ilişkileri belirtmek için kullanılır:
@OneToOne: İki entity sınıfı arasında bire bir ilişki olduğunu belirtir.
@OneToMany: Bir entity sınıfı ile diğer bir entity sınıfı arasında bir çoktan bir ilişki olduğunu belirtir.
@ManyToOne: Bir entity sınıfı ile diğer bir entity sınıfı arasında bir birten çok ilişki olduğunu belirtir.
@ManyToMany: İki entity sınıfı arasında çoktan çoka ilişki olduğunu belirtir.
Örnek Soru 17: Spring Data JPA'da @JoinColumn anotasyonu ne anlama gelir?
Cevap: @JoinColumn anotasyonu, bir entity'nin diğer bir entity ile ilişkilendirildiği sütunu belirtir. Bu anotasyon genellikle @OneToOne ve @ManyToOne anotasyonları ile birlikte kullanılır. Ayrıca, bir entity'nin bir diğerine ait bir sütuna sahip olduğunu ve bu sütunun Foreign Key olarak kullanılacağını belirtir.
Örnek Soru 18: Spring Data JPA'da Entity durumları nelerdir ve bunlar nasıl yönetilir?
Cevap: Bir Entity'nin dört durumu vardır:
Transient: Entity yeni oluşturulmuş ancak henüz persistence context'e eklenmemiş durumdadır.
Persistent: Entity, persistence context'e eklenmiş ve veritabanı ile senkronize edilmiştir.
Detached: Entity, bir zamanlar persistence context'e bağlıydı, ancak artık bağlı değil.
Removed: Entity, silinmek üzere işaretlenmiştir ve transaction commit edildiğinde veritabanından silinir.
EntityManager, bu durumları yönetir. Örneğin, persist() metodu bir transient entity'yi persistent yapar, remove() metodu bir entity'yi removed durumuna getirir ve merge() metodu bir detached entity'yi tekrar persistent yapar.
Örnek 10: Spring Data JPA ile Custom Query Kullanımı
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = ?1")
User findByEmail(String email);
@Query("SELECT u FROM User u WHERE u.username LIKE %?1%")
List<User> findByUsernameContaining(String username);
}
Bu örnekte, UserRepository adında bir JPA Repository oluşturduk ve @Query anotasyonu ile custom query'ler tanımladık. findByEmail metodu, email'e göre bir User'ı bulacaktır. findByUsernameContaining metodu ise, username'inde belirtilen string'i içeren User'ları bulacaktır.
Örnek Soru 19: Spring Data JPA'da @Query anotasyonu ne işe yarar?
Cevap: @Query anotasyonu, repository metotlarına custom query'ler eklemek için kullanılır. Bu anotasyon, JPQL (Java Persistence Query Language) ya da native SQL sorguları kabul eder. JPQL sorguları, Java objeleri üzerinde çalışırken, native SQL sorguları veritabanı tabloları üzerinde çalışır.
Örnek Soru 20: Spring Data JPA'da @NamedQuery ve @NamedQueries anotasyonları ne işe yarar?
Cevap: @NamedQuery ve @NamedQueries anotasyonları, entity sınıflarına veya JPA configuration XML dosyasına isimlendirilmiş sorgular eklemek için kullanılır. Bu sorgular, daha sonra isimleriyle birlikte çağrılabilirler. Bu anotasyonların kullanılmasının avantajı, sorguların uygulama başlatılırken doğrulanmasıdır, böylece hataların daha erken fark edilmesi sağlanır.
Örnek Soru 21: Spring Data JPA'da @EntityGraph anotasyonu ne işe yarar?
Cevap: @EntityGraph anotasyonu, Entity sınıflarının fetch planını özelleştirmek için kullanılır. Bu anotasyon, bir entity'nin belirli ilişkilerini eager fetch modunda yüklemek için kullanılabilir, böylece lazy initialization exception'larının önüne geçilebilir. @EntityGraph anotasyonu, bir metoda veya bir named query'ye uygulanabilir.
Örnek Soru 22: Spring Data JPA'da Optimistic Locking ve Pessimistic Locking arasındaki fark nedir?
Cevap: Optimistic Locking ve Pessimistic Locking, concurrent data access problemlerini çözmek için kullanılır:
Optimistic Locking: Bu yaklaşım, verinin çoğu zaman çakışma olmadan güncelleneceğini varsayar. Bir çakışma olduğunda (örneğin, aynı veriyi birden fazla kullanıcı güncellediğinde), bir exception fırlatılır. Bu yaklaşım genellikle @Version anotasyonu ile bir version alanı ekleyerek uygulanır. Her veri güncellendiğinde, bu version değeri artar. Eğer iki kullanıcı aynı veriyi güncellemeye çalışırsa ve versiyon numaraları eşleşmezse, bir OptimisticLockingFailureException fırlatılır.
Pessimistic Locking: Bu yaklaşım, verinin çoğu zaman çakışarak güncelleneceğini varsayar ve bu nedenle veriyi ilk erişen işlem tarafından kilitler. Diğer işlemler, kilidi alan işlem tamamlanana kadar beklemek zorundadır. Bu yaklaşım, veri bütünlüğünü korumak için daha güvenlidir, ancak performansı etkileyebilir çünkü işlemler kilit nedeniyle beklemek zorunda kalabilir.
Örnek Soru 23: Spring Data JPA'da CrudRepository ve JpaRepository arasındaki fark nedir?
Cevap: Hem CrudRepository hem de JpaRepository, veritabanı işlemlerini gerçekleştirmek için metodlar sağlar. Ancak JpaRepository, CrudRepository'nin tüm özelliklerine ek olarak JPA ile ilgili özellikler de sunar:
JpaRepository flush ve delete işlemlerini batch halinde gerçekleştirme yeteneğine sahiptir.
JpaRepository ayrıca, entity'lerin hemen persist edilmesini sağlayan flush() ve saveAndFlush() metodlarına sahiptir.
JpaRepository ayrıca, entity'lerin veritabanından tamamen silinmesini sağlayan deleteInBatch() ve deleteAllInBatch() metodlarına sahiptir.
Öyleyse, eğer projenizde JPA özelliklerine ihtiyaç duyuyorsanız JpaRepository'yi kullanabilirsiniz. Eğer basit CRUD operasyonlarına ihtiyacınız varsa CrudRepository yeterli olacaktır.
Örnek 11: Spring Data JPA'da Paging and Sorting Kullanımı
java
Copy code
@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
Page<User> findByActiveTrue(Pageable pageable);
List<User> findByActiveTrue(Sort sort);
}
Bu örnekte UserRepository adında bir JPA Repository oluşturduk ve PagingAndSortingRepository'yi extend ettik. findByActiveTrue(Pageable pageable) metodu, aktif kullanıcıları belirli bir sayfa yapısına göre getirir. findByActiveTrue(Sort sort) metodu ise, aktif kullanıcıları belirli bir sıralamaya göre getirir.
Örnek Soru 24: Spring Data JPA'da pagination ve sorting nasıl yapılır?
Cevap: Spring Data JPA, pagination ve sorting için PagingAndSortingRepository adında bir arayüz sağlar. Bu arayüz, findAll(Pageable pageable) ve findAll(Sort sort) gibi metodları tanımlar. Pageable ve Sort objeleri, sıralama ve sayfalama parametrelerini belirtmek için kullanılır.
Örnek Soru 25: Spring Data JPA'da @Transactional anotasyonu ne anlama gelir?
Cevap: @Transactional anotasyonu, bir metodun bir transaction içinde çalıştığını belirtir. Bu anotasyon, bir metodun başında yeni bir transaction başlatılır ve metodun sonunda bu transaction commit edilir anlamına gelir. Eğer metod çalışırken bir exception fırlatılırsa, transaction rollback edilir. @Transactional anotasyonu, isolation level, propagation behavior ve read-only flag gibi özellikler de belirleyebilir.
Örnek Soru 26: Spring Data JPA'da @NoRepositoryBean anotasyonu ne anlama gelir?
Cevap: @NoRepositoryBean anotasyonu, bir repository arayüzünün veya sınıfının Spring tarafından otomatik olarak oluşturulmasını engeller. Bu anotasyon genellikle, diğer repository'ler tarafından extend edilen base repository'ler için kullanılır. Bu base repository'ler genellikle implementation içermezler ve dolayısıyla Spring tarafından instantiate edilmemeleri gerekir.
Örnek Soru 27: Spring Data JPA'da @Modifying anotasyonu ne anlama gelir?
Cevap: @Modifying anotasyonu, @Query anotasyonu ile birlikte kullanılır ve bu query'nin bir update veya delete query olduğunu belirtir. Bu anotasyon olmadan, @Query ile tanımlanan sorgular sadece select işlemleri için kullanılabilir. Bir query'yi update veya delete işlemi için kullanmak istiyorsanız, @Modifying anotasyonunu eklemelisiniz.
Örnek 12: Spring Data JPA'da Projection Kullanımı
java
Copy code
public interface UserProjection {
String getUsername();
String getEmail();
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<UserProjection> findProjectedByUsername(String username);
}
Bu örnekte UserProjection adında bir projection interface oluşturduk ve UserRepository'de findProjectedByUsername metodunda bu projection'ı kullandık. Bu metot, belirli bir username'e sahip kullanıcıları bulacak ve yalnızca username ve email alanlarını döndürecektir.
Örnek Soru 28: Spring Data JPA'da projection nedir ve ne için kullanılır?
Cevap: Projection, veritabanından döndürülen veriyi özelleştirmek için kullanılır. Bir projection, veritabanından getirilen verinin hangi alanlarını içereceğini belirler. Bu, gereksiz verinin getirilmesini önleyerek performansı artırabilir. Spring Data JPA'da, bir interface oluşturarak ve bu interface'de getter metodları tanımlayarak bir projection oluşturabilirsiniz. Daha sonra, bu projection'ı repository metotlarında kullanabilirsiniz.
Örnek Soru 29: Spring Data JPA'da @EntityListeners anotasyonu ne anlama gelir?
Cevap: @EntityListeners anotasyonu, bir entity'nin lifecycle event'lerini dinlemek için kullanılır. Bu anotasyon, entity sınıfının üstünde kullanılır ve bir ya da daha fazla listener sınıfı belirtir. Bu listener sınıfları, entity'nin lifecycle event'lerini (örneğin, @PrePersist, @PostPersist, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove ve @PostLoad) dinleyebilir ve bu event'lere karşılık belirli işlemleri gerçekleştirebilir.
Örnek Soru 30: Spring Data JPA'da @Embeddable ve @Embedded anotasyonları ne anlama gelir?
Cevap: @Embeddable ve @Embedded anotasyonları, bir entity sınıfı içinde başka bir sınıfın alanlarını doğrudan gömmek (embed) için kullanılır:
@Embeddable anotasyonu, gömülebilir bir sınıfı belirtir. Bu sınıfın alanları, bir entity sınıfı içinde doğrudan gömülebilir.
@Embedded anotasyonu, bir entity sınıfında gömülebilir bir sınıfın bir instance'ını belirtir.
Bu anotasyonların kullanılması, veri tabanı tablolarının normalize edilmesine yardımcı olur ve ayrıca veri tabanı şemasının daha esnek ve yeniden kullanılabilir olmasını sağlar.
Örnek 13: Spring Data JPA'da Specification Kullanımı
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
// other methods...
}
// in your service class
public List<User> findUsersWithSpecifications(SearchCriteria searchCriteria) {
Specification<User> spec =
Specification.where(new UserWithFirstNameSpecification(searchCriteria.getFirstName()))
.and(new UserWithLastNameSpecification(searchCriteria.getLastName()));
return userRepository.findAll(spec);
}
Bu örnekte UserRepository'de JpaSpecificationExecutor'yı extend ettik. findUsersWithSpecifications metodu, bir Specification objesi oluşturur ve bu objeyi kullanarak belirli kriterlere uyan kullanıcıları bulur.
Örnek Soru 31: Spring Data JPA'da specification nedir ve ne için kullanılır?
Cevap: Specification, Spring Data JPA'da dinamik sorgu oluşturmak için kullanılan bir tekniktir. Bir specification, bir veya daha fazla sorgu kriterini temsil eder ve bu kriterlere göre veritabanından veri getirir. JpaSpecificationExecutor interface'i, Specification objelerini kullanarak sorguları çalıştırmak için metodlar sağlar.
Örnek Soru 32: Spring Data JPA'da @CreatedBy, @LastModifiedBy, @CreatedDate ve @LastModifiedDate anotasyonları ne anlama gelir?
Cevap: Bu anotasyonlar, entity'nin kim tarafından oluşturulduğunu, kim tarafından en son değiştirildiğini, ne zaman oluşturulduğunu ve ne zaman en son değiştirildiğini otomatik olarak takip etmek için kullanılır:
@CreatedBy: Entity ilk kez persist edildiğinde, bu alanın değeri otomatik olarak mevcut kullanıcıya atanır.
@LastModifiedBy: Entity her güncellendiğinde, bu alanın değeri otomatik olarak mevcut kullanıcıya atanır.
@CreatedDate: Entity ilk kez persist edildiğinde, bu alanın değeri otomatik olarak mevcut tarihe ve zamana atanır.
@LastModifiedDate: Entity her güncellendiğinde, bu alanın değeri otomatik olarak mevcut tarihe ve zamana atanır.
Bu anotasyonları kullanabilmek için Spring Data JPA'da auditing özelliğini etkinleştirmeniz gerekir.
Örnek Soru 33: Spring Data JPA'da @OneToOne, @OneToMany, @ManyToOne ve @ManyToMany anotasyonları ne anlama gelir?
Cevap: Bu anotasyonlar, entity'ler arasındaki ilişkileri belirtmek için kullanılır:
@OneToOne: İki entity arasında bir-e-bir ilişki olduğunu belirtir.
@OneToMany: İki entity arasında bir-e-çok ilişki olduğunu belirtir.
@ManyToOne: İki entity arasında çok-e-bir ilişki olduğunu belirtir.
@ManyToMany: İki entity arasında çok-e-çok ilişki olduğunu belirtir.
Her bir anotasyon, entity'ler arasındaki ilişkinin doğasını ve ilişki yönünü belirtir.
Örnek Soru 34: Spring Data JPA'da @Query anotasyonu ne anlama gelir?
Cevap: @Query anotasyonu, bir repository metodunda kullanılır ve bu metodun bir veritabanı sorgusunu temsil ettiğini belirtir. Bu anotasyon, bir JPQL (Java Persistence Query Language) veya native SQL sorgusu içerir. Bu anotasyon sayesinde, özel sorgular oluşturarak daha karmaşık veritabanı işlemlerini gerçekleştirebilirsiniz.
Örnek Soru 35: Spring Data JPA'da @NamedQuery ve @NamedQueries anotasyonları ne anlama gelir?
Cevap: @NamedQuery ve @NamedQueries anotasyonları, isimlendirilmiş sorguları tanımlamak için kullanılır:
@NamedQuery anotasyonu, tek bir isimlendirilmiş sorguyu belirtir. Bu anotasyon, bir sorgu adı ve JPQL sorgusu içerir.
@NamedQueries anotasyonu, birden fazla @NamedQuery anotasyonunu gruplamak için kullanılır.
Isimlendirilmiş sorgular, genellikle sıkça kullanılan veya karmaşık olan sorgular için kullanılır. Isimlendirilmiş sorgular, uygulama başlatıldığında önceden derlenir, bu nedenle çalışma zamanında hataların önceden tespit edilmesini ve sorgu performansının artırılmasını sağlar.
Örnek 14: Spring Data JPA'da Custom Repository Kullanımı
java
Copy code
public interface CustomUserRepository {
List<User> findUsersWithCustomQuery(String criteria);
}
public class CustomUserRepositoryImpl implements CustomUserRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<User> findUsersWithCustomQuery(String criteria) {
// implement your custom query using EntityManager...
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
// other methods...
}
Bu örnekte CustomUserRepository adında bir custom repository interface oluşturduk ve CustomUserRepositoryImpl adında bu interface'i implement eden bir sınıf oluşturduk. Sonra UserRepository'de bu custom repository'i extend ettik. Artık UserRepository'yi kullanarak custom sorguları çalıştırabiliriz.
Örnek Soru 36: Spring Data JPA'da custom repository nedir ve ne için kullanılır?
Cevap: Custom repository, standard Spring Data JPA repository metodlarının dışında özel sorgular ve işlemler içeren bir repository'dir. Bir custom repository oluşturmak için genellikle bir interface ve bu interface'i implement eden bir sınıf oluşturursunuz. Daha sonra, bu custom repository interface'ini main repository interface'inizde extend edersiniz. Bu, özel sorguları ve işlemleri Spring Data JPA'nın sağladığı olanaklarla birleştirmenizi sağlar.
Örnek Soru 37: Spring Data JPA'da @Entity anotasyonu ne anlama gelir?
Cevap: @Entity anotasyonu, bir sınıfın bir JPA entity'si olduğunu belirtir. Bu anotasyonun kullanıldığı sınıflar, veritabanındaki tabloları temsil eder ve bu sınıfların her bir instance'ı, tablonun bir satırını temsil eder. @Entity anotasyonunu kullandığınız sınıflarda, bir primary key belirtmek için @Id anotasyonunu da kullanmalısınız.
Örnek Soru 38: Spring Data JPA'da @PersistenceContext anotasyonu ne anlama gelir?
Cevap: @PersistenceContext anotasyonu, EntityManager instance'ı enjekte etmek için kullanılır. EntityManager, entity'lerle çalışmak için kullanılan ana API'dir. EntityManager'ı kullanarak, CRUD işlemlerini gerçekleştirebilir, transactionları yönetebilir ve sorguları çalıştırabilirsiniz.
Örnek Soru 39: Spring Data JPA'da @EnableJpaRepositories anotasyonu ne anlama gelir?
Cevap: @EnableJpaRepositories anotasyonu, Spring Data JPA repository'lerin otomatik olarak yapılandırılmasını ve oluşturulmasını sağlar. Bu anotasyon genellikle ana configuration sınıfında kullanılır ve repository'lerin bulunduğu package'ı belirtir. Bu anotasyon olmadan, Spring Data @EnableJpaRepositories anotasyonu, Spring Data JPA repository'lerin otomatik olarak yapılandırılmasını ve oluşturulmasını sağlar. Bu anotasyon genellikle ana configuration sınıfında kullanılır ve repository'lerin bulunduğu package'ı belirtir. Bu anotasyon olmadan, Spring Data JPA repository'lerinizi otomatik olarak tanımaz ve oluşturmaz.
Örnek Soru 40: Spring Data JPA'da @Transactional anotasyonu ne anlama gelir?
Cevap: @Transactional anotasyonu, bir metot veya sınıfın bir transactional context içinde çalıştığını belirtir. Bu anotasyonun belirtildiği metot veya sınıf, bir veritabanı transaction'ını temsil eder. Bu transaction, metot başladığında başlar ve metot bittiğinde commit edilir veya rollback edilir. Bu anotasyon sayesinde, transaction yönetimi otomatik hale gelir ve ACID özelliklerini garanti altına alır. Transactional yönetim, veritabanı işlemlerinin bütünlüğünü, izolasyonunu ve sürekliliğini sağlar.
Örnek Soru 41: Spring Data JPA'da @Version anotasyonu ne anlama gelir?
Cevap: @Version anotasyonu, bir entity sınıfında bir versiyon alanı belirtir. Bu alan genellikle optimistic locking stratejileri için kullanılır. Veritabanında bir row'un aynı anda birden fazla kullanıcı veya işlem tarafından güncellenmeye çalışılması durumunda, çakışmaları önlemek için kullanılır. Eğer bir işlem, bir row'u güncellemeye çalışır ve bu row'un versiyon değeri işlem başladığından beri değiştiyse, bir OptimisticLockingFailureException fırlatılır. Bu, bir başka işlemin bu row'u güncellediğini ve bu nedenle mevcut işlemin güncellemesinin güvenli olmadığını gösterir.
Örnek 15: Spring Data JPA'da Pagination Kullanımı
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findByLastName(String lastName, Pageable pageable);
}
Bu örnekte findByLastName metodu, bir Pageable parametresi alır ve bir Page<User> döndürür. Bu metodu kullanarak, belirli bir soyada sahip olan kullanıcıları sayfalayarak getirebilirsiniz.
Örnek Soru 42: Spring Data JPA'da pagination nasıl kullanılır?
Cevap: Pagination, veri tabanındaki büyük miktarda veriyi sayfalara bölerek işlemek için kullanılır. Spring Data JPA'da pagination, Pageable interface'i ve Page sınıfı kullanılarak gerçekleştirilir.
Bir repository metodu, bir Pageable parametresi alabilir. Bu parametre, sayfa numarası, sayfa boyutu ve sıralama bilgisi içerir. Bu parametreyi kullanarak, sorgunuzun sonuçlarını belirli bir sayfa boyutuna ve belirli bir sıralama düzenine göre alabilirsiniz.
Ayrıca repository metodu, bir Page nesnesi döndürebilir. Bu nesne, mevcut sayfanın içeriğini, toplam sayfa sayısını, mevcut sayfa numarasını ve diğer pagination bilgilerini içerir.
Örnek Soru 43: Spring Data JPA'da sorting nasıl kullanılır?
Cevap: Spring Data JPA'da sorting, Sort sınıfı kullanılarak gerçekleştirilir. Bir Sort nesnesi oluşturabilir ve bu nesneyi bir repository metoduna parametre olarak geçirebilirsiniz. Bu nesne, hangi alanlara göre ve hangi düzende sıralama yapılacağını belirtir. Ayrıca, bir Pageable nesnesi içinde bir Sort nesnesi belirleyebilirsiniz. Bu sayede, sayfalama ve sıralama işlemlerini bir arada gerçekleştirebilirsiniz.
Örnek Soru 44: Spring Data JPA'da projection nasıl kullanılır?
Cevap: Projection, veri tabanından sadece belirli alanların getirilmesi için kullanılır. Spring Data JPA'da, bir interface veya sınıfı bir projection olarak tanımlayabilir ve bir repository metodu bu projection'ı döndürebilir. Bu sayede, sorgunuzun sonucu olarak sadece belirli alanları alabilir ve veri tabanı trafiğini azaltabilirsiniz.
Örneğin, User entity'sinde firstName, lastName ve email alanlarınız varsa, ancak sadece firstName ve lastName'i getirmek istiyorsanız, bu alanları içeren bir projection oluşturabilir ve bu projection'ı döndüren bir repository metodu kullanabilirsiniz:
java
Copy code
public interface NameProjection {
String getFirstName();
String getLastName();
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<NameProjection> findByLastName(String lastName);
}
Bu örnekte NameProjection adında bir projection oluşturduk ve findByLastName metodu bu projection'ı döndürür. Bu metodu kullanarak, belirli bir soyada sahip olan kullanıcıların ad ve soyadlarını getirebiliriz.
Örnek Soru 45: Spring Data JPA'da SpEL (Spring Expression Language) kullanımı nedir?
Cevap: Spring Expression Language (SpEL), Spring Framework'ün bir parçası olan güçlü bir expression dili sunar. SpEL, runtime'da object grafiğini sorgulamak ve manipüle etmek için kullanılabilir.
Spring Data JPA'da, @Query anotasyonu içinde SpEL ifadeleri kullanabilirsiniz. Bu, dinamik sorgular oluşturmak için oldukça kullanışlıdır. Örneğin, #{#entityName} ifadesi, metodu barındıran repository'nin çalıştığı entity'nin adını verir.
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from #{#entityName} u where u.lastName = ?1")
List<User> findByLastName(String lastName);
}
Bu örnekte #{#entityName} ifadesi User olarak değerlendirilir ve sorgu, select u from User u where u.lastName = ?1 şeklinde oluşturulur.
Örnek Soru 46: Spring Data JPA'da @Modifying anotasyonu ne anlama gelir?
Cevap: @Modifying anotasyonu, bir @Query anotasyonu ile birlikte kullanılır ve bu sorgunun bir update veya delete sorgusu olduğunu belirtir. Bu anotasyon, Spring Data JPA'nın sorgunun sonucunun bir entity listesi yerine bir int (etkilenen row sayısı) olacağını anlamasını sağlar.
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@Query("delete from User u where u.lastName = ?1")
int deleteByLastName(String lastName);
}
Bu örnekte deleteByLastName metodu, belirli bir soyada sahip olan kullanıcıları siler ve silinen kullanıcıların sayısını döndürür.
Örnek 16: Spring Data JPA'da Native Query Kullanımı
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM Users WHERE Users.last_name = ?1", nativeQuery = true)
List<User> findByLastName(String lastName);
}
Bu örnekte, @Query anotasyonunu nativeQuery = true parametresiyle birlikte kullanarak bir native SQL sorgusu belirledik. Bu metodu kullanarak, belirli bir soyada sahip olan kullanıcıları getirebilirsiniz.
Örnek Soru 47: Spring Data JPA'da native query nedir ve ne zaman kullanılır?
Cevap: Native query, belirli bir SQL diyalektinde yazılan saf SQL sorgularıdır. Spring Data JPA'da, @Query anotasyonunu nativeQuery = true parametresiyle birlikte kullanarak native SQL sorguları belirleyebilirsiniz. Native query'ler genellikle, JPQL'nin (Java Persistence Query Language) sağladığı özelliklerin yetersiz kaldığı durumlarda veya belirli bir veritabanı özelliğini kullanmak istediğinizde kullanılır.
Örnek Soru 48: Spring Data JPA'da @Query anotasyonu ne anlama gelir?
Cevap: @Query anotasyonu, bir repository metodunda custom bir sorgu belirtmek için kullanılır. Bu anotasyonun içinde, JPQL (Java Persistence Query Language) veya native SQL dilinde bir sorgu ifadesi belirtirsiniz. Bu sorgu, metot çağrıldığında çalıştırılır ve sonuçları döndürür.
Örnek Soru 49: Spring Data JPA'da @Param anotasyonu ne anlama gelir?
Cevap: @Param anotasyonu, @Query anotasyonunda belirtilen bir sorguda parametre adını belirtmek için kullanılır. @Param anotasyonunu bir metod parametresine uygulayabilir ve bu parametrenin adını belirtebilirsiniz. Daha sonra bu adı, @Query anotasyonunda belirtilen sorguda bir parametre değeri olarak kullanabilirsiniz.
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.lastName = :lastName")
List<User> findByLastName(@Param("lastName") String lastName);
}
Bu örnekte :lastName, @Query anotasyonunda belirtilen sorguda bir parametre yer tutucusudur ve @Param("lastName") ile belirtilen metod parametresinin değeriyle değiştirilir.
Örnek Soru 50: Spring Data JPA'da CascadeType nedir? Ne işe yarar?
Cevap: CascadeType, entity ilişkilerinde hangi işlemlerin (persist, merge, remove, refresh, detach) ilişkili entity'lere de uygulanacağını belirtir.Örneğin, bir User entity'si ile Order entity'si arasında OneToMany ilişki varsa ve bu ilişki üzerinde CascadeType.PERSIST belirtilmişse, User entity'si persist edildiğinde ilişkili olan Order entity'leri de otomatik olarak persist edilir.
Aynı şekilde, CascadeType.REMOVE belirtildiğinde, bir User entity'si silindiğinde ilişkili Order entity'leri de silinir. Farklı CascadeType değerleri farklı davranışlar sağlar ve birden fazla CascadeType değeri belirtilebilir.
java
Copy code
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private List<Order> orders;
//...
}
Bu örnekte User ve Order arasındaki ilişki için CascadeType.ALL belirtildi. Bu durumda, bir User persist edildiğinde, merge edildiğinde, silindiğinde, refresh edildiğinde veya detach edildiğinde, aynı işlem ilişkili Order entity'lerine de uygulanır.
Örnek 17: Spring Data JPA'da @EntityGraph Kullanımı
java
Copy code
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
//...
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@EntityGraph(attributePaths = {"orders"})
Optional<User> findById(Long id);
}
Bu örnekte @EntityGraph anotasyonunu attributePaths = {"orders"} parametresiyle birlikte kullandık. Bu, findById metodu çağrıldığında User entity'sini ve ilişkili Order entity'lerini tek bir sorguda getirir.
Örnek Soru 51: Spring Data JPA'da @EntityGraph anotasyonu ne anlama gelir ve ne zaman kullanılır?
Cevap: @EntityGraph anotasyonu, bir entity'nin ilişkili entity'leriyle birlikte tek bir sorguda nasıl getirileceğini belirtmek için kullanılır. Bu, lazy loading ile ilgili performance sorunlarını önlemek için kullanışlıdır.
Lazy loading, bir entity'nin ilişkili entity'lerinin ancak gerekli olduklarında getirilmesi anlamına gelir. Ancak bu, bir entity ve ilişkili entity'ler arasında çok sayıda back-and-forth sorgu oluşturabilir ve bu da performance sorunlarına neden olabilir.
Bu sorunları önlemek için, @EntityGraph anotasyonunu kullanarak bir entity ve ilişkili entity'lerinin tek bir sorguda getirilmesini sağlayabilirsiniz.
Örnek Soru 52: Spring Data JPA'da FetchType.LAZY ve FetchType.EAGER arasındaki fark nedir?
Cevap: FetchType.LAZY ve FetchType.EAGER, entity ilişkilerinin nasıl yüklendiğini belirler:
FetchType.LAZY: Bu değer belirtildiğinde, ilişkili entity'ler ancak gerekli olduklarında yüklenir. Bu, bir entity'nin ilişkili entity'lerini kullanmadan sadece bu entity'yi getirmeniz gerektiğinde kullanışlıdır. Ancak bu, lazy loading ile ilgili performance sorunlarına neden olabilir.
FetchType.EAGER: Bu değer belirtildiğinde, ilişkili entity'ler her zaman ana entity ile birlikte yüklenir. Bu, bir entity'nin her zaman ilişkili entity'lerini kullanmanız gerektiğinde kullanışlıdır. Ancak bu, gereksiz yere çok sayıda entity'nin yüklenmesine ve bu nedenle performance sorunlarına neden olabilir.
Genellikle, FetchType.LAZY önerilir ve gerekli olduğunda @EntityGraph anotasyonu veya JOIN FETCH gibi tekniklerle ilişkili entity'lerin yüklenmesi sağlanır.
Örnek Soru 53: Spring Data JPA'da @CreatedBy, @LastModifiedBy, @CreatedDate, @LastModifiedDate anotasyonlarının işlevi nedir?
Cevap: Bahsi geçen bu dört anotasyon, Spring Data JPA'nın auditing özelliklerini kullanır. Auditing, bir verinin kim tarafından ve ne zaman oluşturulduğunu veya değiştirildiğini izlemenize yardımcı olur.
@CreatedBy: Bu anotasyon, verinin kim tarafından oluşturulduğunu belirler. Spring Security'deki oturum kullanıcısının kimliğini otomatik olarak belirler.
@CreatedDate: Bu anotasyon, verinin ne zaman oluşturulduğunu belirler. Verinin oluşturulma tarihini ve saatini otomatik olarak belirler.
@LastModifiedBy: Bu anotasyon, verinin en son kim tarafından değiştirildiğini belirler. Spring Security'deki oturum kullanıcısının kimliğini otomatik olarak belirler.
@LastModifiedDate: Bu anotasyon, verinin en son ne zaman değiştirildiğini belirler. Verinin son değiştirilme tarihini ve saatini otomatik olarak belirler.
Bu anotasyonların çalışabilmesi için, genellikle ana configürasyon sınıfında @EnableJpaAuditing anotasyonunu eklemeniz gerekmektedir.
java
Copy code
@Entity
@EntityListeners(AuditingEntityListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedBy
private String createdBy;
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
//...
}
Bu örnekte, User entity'si, kim tarafından ve ne zaman oluşturulduğunu ve en son kim tarafından ve ne zaman değiştirildiğini otomatik olarak izler.
Örnek Soru 54: Spring Data JPA'da Pagination ve Sorting özelliklerinin kullanımı nasıldır?
Cevap: Spring Data JPA, veri listelerini sıralamak ve sayfalamak için Sort ve Pageable parametrelerini sağlar.
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findByLastName(String lastName, Pageable pageable);
}
Bu örnekte, findByLastName metodu bir Pageable parametresi alır ve bir Page<User> döndürür. Pageable parametresi, hangi sayfanın getirileceğini ve her sayfada kaç tane kayıt olacağını belirtir. Ayrıca sıralama bilgisi de içerebilir.
java
Copy code
Page<User> users = userRepository.findByLastName("Smith", PageRequest.of(0, 20, Sort.by("firstName")));
Bu örnekte, soyadı "Smith" olan ilk 20 kullanıcıyı, adlarına göre sıralı bir şekilde getiririz. Burada PageRequest.of(0, 20, Sort.by("firstName")) ifadesi ile 0. sayfadan başlayarak 20 adet kaydı, firstName alanına göre sıralı bir şekilde getirmeyi belirtmiş oluyoruz.
Örnek Soru 55: Spring Data JPA'da Transactional anotasyonunun rolü nedir?
Cevap: @Transactional anotasyonu, bir metot veya sınıfın bir transaction içerisinde çalıştırılmasını belirtir. Transactional bir metot çağrıldığında, Spring bir transaction başlatır. Metot başarıyla tamamlandığında transaction commit edilir. Eğer metot çalışırken bir exception oluşursa, transaction otomatik olarak rollback edilir. Bu, veri bütünlüğünü sağlamak için önemlidir.
java
Copy code
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User updateUser(Long id, User updatedUser) {
User user = userRepository.findById(id).orElseThrow(() -> new UserNotFoundException(id));
user.setFirstName(updatedUser.getFirstName());
user.setLastName(updatedUser.getLastName());
return userRepository.save(user);
}
}
Bu örnekte updateUser metodu @Transactional anotasyonuyla işaretlenmiştir. Eğer UserNotFoundException veya başka bir exception fırlatılırsa, transaction otomatik olarak rollback edilir ve User entity'si değişmez. Eğer her şey başarıyla tamamlanırsa, transaction commit edilir ve User entity'sindeki değişiklikler veritabanına yansıtılır.
Örnek Soru 56: Spring Data JPA'da Projection ne anlama gelir ve ne zaman kullanılır?
Cevap: Projection, bir query'nin sonucunda dönen verinin şeklini veya yapısını değiştirmenize izin verir. Bu, sadece belirli bir set veriye ihtiyaç duyduğunuzda ve gereksiz verilerin yüklenmesini önlemek istediğinizde kullanışlıdır.
java
Copy code
public interface UserProjection {
String getFirstName();
String getLastName();
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<UserProjection> findByLastName(String lastName);
}
Bu örnekte, UserProjection interface'ini bir Projection olarak kullanırız. UserProjection interface'inde tanımlanan metotlar, dönen verinin hangi alanları içereceğini belirler. Bu durumda, UserProjection sadece firstName ve lastName alanlarını içerir. UserRepository'deki findByLastName metodu, lastName'e göre filtrelenen kullanıcıların sadece firstName ve lastName alanlarını getirir.
Örnek Soru 57: Spring Data JPA'da @Query anotasyonu ne zaman ve nasıl kullanılır?
Cevap: @Query anotasyonu, özel bir JPQL (Java Persistence Query Language) veya SQL sorgusu oluşturmanızı sağlar. Bu, daha karmaşık veya optimize edilmiş sorgular oluşturmanız gerektiğinde kullanılır.
java
Copy code
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.firstName = ?1")
List<User> findUsersByFirstName(String firstName);
}
Bu örnekte, findUsersByFirstName metodu için bir JPQL sorgusu belirttik. Sorgu, firstName alanı belirli bir değere eşit olan tüm User entity'lerini seçer.
Örnek Soru 58: Spring Data JPA'da @NamedEntityGraph anotasyonu ne anlama gelir ve ne zaman kullanılır?
Cevap: @NamedEntityGraph anotasyonu, bir entity graph'ı adlandırmanızı ve daha sonra bu adı kullanarak bu graph'ı referans vermenizi sağlar. Bu, birkaç farklı sorguda aynı entity graph'ı kullanmanız gerektiğinde kullanışlıdır.
java
Copy code
@Entity
@NamedEntityGraph(name = "User.orders",
attributeNodes = @NamedAttributeNode("orders"))
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
//...
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@EntityGraph("User.orders")
List<User> findAll();
}
Bu örnekte, User entity'si için bir entity graph oluşturduk ve bu graph'ı "User.orders" adıyla adlandırdık. Daha sonra UserRepository'deki findAll metodu için bu adı @EntityGraph anotasyonuyla belirttik. Bu, findAll metodu çağrıldığında tüm User entity'lerini ve ilişkili Order entity'lerini tek bir sorguda getirir.
Örnek Soru 59: Spring Data JPA'da @Transactional(readOnly = true) anotasyonunun rolü nedir?
Cevap: @Transactional(readOnly = true) anotasyonu, bir metot veya sınıfın bir okuma-only transaction içerisinde çalıştırılmasını belirtir. Bu, verinin değiştirilmediği ve sadece okunduğu durumlarda performansı artırmak için kullanılır.
java
Copy code
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(readOnly = true)
public List<User> findAllUsers() {
return userRepository.findAll();
}
}
Bu örnekte findAllUsers metodu @Transactional(readOnly = true) anotasyonuyla işaretlenmiştir. Bu metot sadece veriyi okur ve herhangi bir değişiklik yapmaz, bu yüzden `readOnly = true
Örnek Soru 60: Spring Data JPA'da @Version anotasyonu ne için kullanılır?
Cevap: @Version anotasyonu, optimistic locking stratejisi için kullanılır. Bu anotasyon ile işaretlenen alan her seferinde bir entity güncellendiğinde otomatik olarak artar. Bu, birden çok transaction'ın aynı veriyi güncelleme çakışmalarını önlemeye yardımcı olur. Eğer bir transaction eski bir versiyon numarası ile bir entity'yi güncellemeye çalışırsa, bir OptimisticLockingFailureException fırlatılır.
java
Copy code
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Version
private int version;
//...
}
Bu örnekte, User entity'si için bir version alanı tanımlıyoruz ve bu alanı @Version anotasyonuyla işaretliyoruz. Bu alan her User entity'si güncellendiğinde otomatik olarak artar.
Örnek Soru 61: Spring Data JPA'da CrudRepository ve JpaRepository arasındaki fark nedir?
Cevap: CrudRepository ve JpaRepository her ikisi de repository'ler için temel interface'lerdir ve çeşitli işlevler sağlarlar, ancak farklı özelliklere sahiptirler.
CrudRepository: CRUD işlevleri (Oluşturma, Okuma, Güncelleme, Silme) sağlar. CrudRepository'i genellikle basit CRUD operasyonları için kullanılır.
JpaRepository: CrudRepository'nin tüm işlevlerini sağlar ve ek olarak, sayfalama ve sıralama gibi ek işlevler de sağlar. Ayrıca, JpaRepository flushing otomatik olarak ayarlanır, bu da her transaction sonunda otomatik flush ve commit'in yapılacağı anlamına gelir.
Genellikle, eğer ek işlevlere ihtiyacınız yoksa CrudRepository kullanabilirsiniz. Ancak, sayfalama ve sıralama gibi ek işlevlere ihtiyacınız varsa veya JPA'nın diğer özelliklerini kullanmak istiyorsanız, JpaRepository'yi kullanabilirsiniz.
Örnek Soru 62: Spring Data JPA'da EntityNotFoundException ne zaman atılır?
Cevap: EntityNotFoundException, bir entity'nin beklenildiği gibi bulunamadığı durumlarda atılır. Bu genellikle getOne() veya load() gibi metotlar ile bir entity'yi yüklemeye çalıştığınızda ve ilgili ID'ye sahip bir entity'nin bulunamadığı durumlarda olur.
java
Copy code
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findUserById(Long id) {
return userRepository.findById(id).orElseThrow(EntityNotFoundException::new);
}
}
Bu örnekte, findUserById metodu, belirli bir ID'ye sahip bir User'ı getirir. Eğer bu ID'ye sahip bir User bulunamazsa, orElseThrow(EntityNotFoundException::new) ifadesi bir EntityNotFoundException fırlatır. Bu sayede, aranan ID'ye sahip bir User'ın olmaması durumunda hemen bir hata dönebilir ve bu durumu hızlı bir şekilde ele alabilirsiniz.
Örnek Soru 63: Spring Data JPA'da @PrePersist ve @PreUpdate anotasyonları ne zaman ve nasıl kullanılır?
Cevap: @PrePersist ve @PreUpdate anotasyonları, bir entity'nin veritabanına kaydedilmeden veya güncellenmeden önce çalışacak metotları belirtmek için kullanılır. Bu, bir entity'yi veritabanına kaydetmeden veya güncellemeden önce belirli bir işlem gerçekleştirmeniz gerektiğinde kullanılır.
java
Copy code
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
//...
@PrePersist
public void prePersist() {
createdDate = LocalDateTime.now();
}
@PreUpdate
public void preUpdate() {
updatedDate = LocalDateTime.now();
}
}
Bu örnekte, @PrePersist anotasyonunu prePersist() metodu için ve @PreUpdate anotasyonunu preUpdate() metodu için kullanıyoruz. prePersist() metodu, bir User entity'si veritabanına kaydedilmeden önce çağrılır ve createdDate alanını şimdiki zamanla set eder. preUpdate() metodu, bir User entity'si güncellendiğinde çağrılır ve updatedDate alanını şimdiki zamanla set eder.
Örnek Soru 64: Spring Data JPA'da Fetch Türleri (Fetch Types) nelerdir ve ne zaman kullanılır?
Cevap: JPA'da iki tür fetch türü vardır: Eager ve Lazy.
EAGER Fetch: İlişkili entity'ler hemen yüklenir. Bu, ilişkili entity'lere her zaman ihtiyaç duyduğunuzda kullanışlıdır.
LAZY Fetch: İlişkili entity'ler sadece onlara erişildiğinde yüklenir. Bu, ilişkili entity'lere sadece belirli durumlardan ihtiyaç duyduğunuzda kullanışlıdır.
Fetch türü, @OneToOne ve @ManyToOne ilişkileri için varsayılan olarak EAGER'dır ve @OneToMany ve @ManyToMany ilişkileri için varsayılan olarak LAZY'dır.
java
Copy code
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Order> orders;
//...
}
Kaldığın yerden devam et yarım bıraktın
Bu örnekte, User ve Order arasında OneToMany ilişkisi bulunur. fetch = FetchType.LAZY parametresi ile ilişkili Order entity'lerinin LAZY fetch türüyle yüklenmesi belirtilir. Bu, User entity'si getirildiğinde ilişkili Order entity'lerinin otomatik olarak yüklenmeyeceği anlamına gelir. Ancak, orders alanına erişildiğinde veya bu alanın yüklenmesi talep edildiğinde Order entity'lerinin yüklenmesi gerçekleşir.
EntityGraph ile EAGER arasındaki fark nedir
EntityGraph ve EAGER, Hibernate ORM (Object-Relational Mapping) tarafından sunulan iki farklı yükleme stratejisidir.
EAGER (hırslı) yükleme stratejisi, bir varlık (entity) örneği yüklendiğinde ilişkili varlıkların (related entities) hemen yüklenmesini sağlar. Örneğin, bir kullanıcı nesnesi alındığında, kullanıcının ilişkili rolleri veya izinleri de otomatik olarak yüklenir. Bu, ilişkili verilerin otomatik olarak yüklenmesini sağlar ve veritabanından ayrı bir sorgu yapma gereksinimini ortadan kaldırır. Bununla birlikte, ilişkili verilerin hepsinin yüklenmesi, gereksiz yere veritabanı trafiğine ve performans sorunlarına yol açabilir. Özellikle büyük veri kümeleri veya derin ilişkili yapılar durumunda performans etkisi daha belirgin olabilir.
EntityGraph ise ilişkili verileri yüklemek için daha esnek bir yol sunar. EntityGraph, belirli bir sorgu veya işlem için yüklenmesi gereken ilişkili varlıkları belirleyen bir yapıdır. Bu, ilişkili varlıkların EAGER yükleme stratejisi yerine belirli bir sorguda veya işlemde yüklenmesini sağlar. Böylece, ilişkili verileri yalnızca ihtiyaç duyulduğunda yükleyebilir ve gereksiz veritabanı trafiği ve performans sorunlarını önleyebilirsiniz.
EntityGraph kullanarak, ilişkili varlıkları daha hassas bir şekilde kontrol edebilir ve yalnızca gerektiğinde yüklenmelerini sağlayabilirsiniz. Bu, performansı artırabilir ve veritabanı trafiğini optimize edebilir. EAGER yükleme stratejisi yerine EntityGraph kullanarak, uygulamanın performansını daha iyi yönetebilir ve veritabanı yükünü azaltabilirsiniz.