19- Veri Tabanı Entegrasyonu ve Spring Data

### 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.