### Spring Data JPA Kullanımı
Spring Data JPA, Java Persistence API (JPA) tabanlı veri erişimi için bir çerçeve sağlar. Veritabanı işlemlerini basitleştirmek için kullanılır ve genellikle Spring Boot ile birlikte kullanılır.
#### Spring Data JPA Temel Kullanımı
1. **Bağımlılıkların Eklenmesi**
**`pom.xml`** (Maven)
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
```
- **`spring-boot-starter-data-jpa`**: JPA için gerekli bağımlılıkları sağlar.
- **`h2`**: H2 veritabanı, testler için hafif bir veritabanıdır (gerçek projelerde genellikle başka bir veritabanı kullanılır).
2. **Entity Sınıfı**
**`User.java`**
```java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter ve Setter metodları
}
```
- **`@Entity`**: Bu sınıfın bir JPA entity olduğunu belirtir.
- **`@Id`**: Primary key özelliğini belirtir.
- **`@GeneratedValue`**: ID'nin otomatik olarak üretilmesini sağlar.
3. **Repository Arayüzü**
**`UserRepository.java`**
```java
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// Bu arayüzde standart CRUD işlemleri sağlanır
}
```
- **`JpaRepository`**: CRUD işlemleri için gerekli metotları sağlar.
4. **Servis ve Controller**
**`UserService.java`**
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public User saveUser(User user) {
return userRepository.save(user);
}
}
```
**`UserController.java`**
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.saveUser(user);
}
}
```
- **`@Service`**: İş mantığını kapsayan sınıfı belirtir.
- **`@RestController`**: RESTful servisleri oluşturur.
- **`@RequestBody`**: JSON veya XML verilerini Java nesnesine dönüştürür.
---
### Hibernate ve Diğer ORM (Object-Relational Mapping) Kütüphaneleri
Hibernate, Java için popüler bir ORM kütüphanesidir. ORM, veritabanı ile nesne tabanlı uygulama arasında bir köprü sağlar. Hibernate, JPA (Java Persistence API) standardını uygular.
#### Hibernate Temel Kullanımı
1. **Bağımlılıklar**
**`pom.xml`** (Maven)
```xml
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.32.Final</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
```
2. **Hibernate Konfigürasyonu**
**`application.properties`** (Spring Boot)
```properties
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
```
- **`spring.jpa.hibernate.ddl-auto`**: Hibernate'in veritabanı şemasını nasıl yöneteceğini belirtir (update, create, validate, none).
3. **Hibernate Kullanımı**
Hibernate ile çalışırken genellikle JPA'yi tercih ederiz, çünkü JPA daha standarttır ve Hibernate JPA'yi implement eder. Ancak, Hibernate'in bazı ileri düzey özelliklerinden yararlanmak istiyorsanız, doğrudan Hibernate API'lerini kullanabilirsiniz.
---
### Transaction Yönetimi
Transaction yönetimi, veritabanı işlemlerinin tutarlı ve güvenilir bir şekilde gerçekleştirilmesini sağlar. Spring, transaction yönetimini `@Transactional` anotasyonu ile sağlar.
#### Spring Transaction Yönetimi
1. **Basit Transaction Yönetimi**
**`UserService.java`**
```java
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public User saveUser(User user) {
// İşlem yaparken transaction otomatik olarak yönetilir
return userRepository.save(user);
}
}
```
- **`@Transactional`**: Bu anotasyon, metodun veya sınıfın bir transaction içinde çalışmasını sağlar.
2. **Transaction Propagation ve Isolation**
- **Propagation**: Transaction'ın nasıl davranacağını belirler (örneğin, `REQUIRED`, `REQUIRES_NEW`).
- **Isolation**: Bir transaction'ın diğer transaction'lardan nasıl izole edileceğini belirtir (örneğin, `READ_COMMITTED`, `SERIALIZABLE`).
**`UserService.java`**
```java
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public User saveUser(User user) {
return userRepository.save(user);
}
```
- **`Propagation.REQUIRED`**: Var olan bir transaction varsa kullanılır, yoksa yeni bir transaction başlatır.
- **`Isolation.READ_COMMITTED`**: Veritabanındaki veriler diğer transaction'lar tarafından değiştirildiğinde okunabilir.
---
### Özet
Spring Data JPA, veri erişimini kolaylaştırır ve Spring Boot ile hızlıca entegre edilebilir. Hibernate, Java için popüler bir ORM kütüphanesidir ve JPA standardını uygular. Transaction yönetimi, veritabanı işlemlerinin tutarlılığını sağlar ve Spring'in `@Transactional` anotasyonu ile yapılır. Bu bilgiler, veri yönetimi ve transaction yönetimi konularında daha etkili bir yaklaşım sağlamanıza yardımcı olacaktır.