jpa ve hibernate
Published: 2024-06-14 16:23:35

Java Persistence API (JPA) ve Hibernate, Java ile ilişkisel veritabanlarına erişim ve yönetim için kullanılan teknolojilerdir. Her iki teknoloji de Object-Relational Mapping (ORM) yaklaşımını kullanarak, Java nesneleri ile veritabanı tabloları arasında bir köprü kurar. Ancak, JPA ve Hibernate arasında bazı önemli farklar bulunmaktadır.

### Java Persistence API (JPA)

**JPA**, Java platformu için standart bir ORM API'sidir. Java EE (Enterprise Edition) ve Jakarta EE standartlarının bir parçasıdır. JPA, ORM araçları için bir çerçeve sunar, ancak kendisi doğrudan bir ORM aracı değildir. JPA, veritabanı işlemleri için bir dizi anotasyon ve API sağlar, ancak JPA'nın kendisi bir implementasyon içermez. Bu nedenle, JPA kullanmak için bir JPA sağlayıcısına ihtiyaç vardır (örneğin, Hibernate, EclipseLink, OpenJPA).

#### JPA'nın Temel Bileşenleri

1. **Entity**: Veritabanı tablosu ile eşleştirilen Java sınıfıdır.
2. **Entity Manager**: Entity nesnelerini yöneten ve veritabanı işlemlerini gerçekleştiren sınıftır.
3. **Persistence Context**: Entity Manager tarafından yönetilen entity nesnelerinin yaşadığı bellek alanıdır.
4. **Query Language (JPQL)**: SQL benzeri bir dil olan JPQL (Java Persistence Query Language) kullanarak veritabanı sorguları yazmanızı sağlar.

#### JPA Kullanımına Örnek

```java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // Getter ve Setter metodları
}
```

### Hibernate

**Hibernate**, popüler bir ORM aracıdır ve JPA sağlayıcısı olarak da kullanılabilir. Hibernate, JPA standartlarını destekler ve kendi ek özelliklerini sunar. Hibernate, veritabanı işlemlerini daha kolay ve daha verimli hale getiren birçok gelişmiş özellik sağlar, örneğin:
- **Cache Management**: İlk ve ikinci seviye önbellekleme.
- **Lazy Loading**: İlişkili nesnelerin gerektiğinde yüklenmesi.
- **Automatic Table Generation**: Entity sınıflarına göre veritabanı tablolarının otomatik oluşturulması.
- **Hibernate Query Language (HQL)**: SQL'e benzer ancak nesneye yönelik bir sorgu dili.

#### Hibernate Kullanımına Örnek

```java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;

    // Getter ve Setter metodları
}
```

Hibernate yapılandırması ve kullanımına örnek:

1. **Maven Bağımlılıkları**:
   ```xml
   <dependencies>
       <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-core</artifactId>
           <version>5.4.32.Final</version>
       </dependency>
       <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-entitymanager</artifactId>
           <version>5.4.32.Final</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.23</version>
       </dependency>
   </dependencies>
   ```

2. **Hibernate Configuration (hibernate.cfg.xml)**:
   ```xml
   <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
   <hibernate-configuration>
       <session-factory>
           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
           <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
           <property name="hibernate.connection.username">your_username</property>
           <property name="hibernate.connection.password">your_password</property>
           <property name="hibernate.hbm2ddl.auto">update</property>
           <property name="hibernate.show_sql">true</property>
           <mapping class="com.example.Employee"/>
       </session-factory>
   </hibernate-configuration>
   ```

3. **Hibernate Util Class (HibernateUtil.java)**:
   ```java
   import org.hibernate.SessionFactory;
   import org.hibernate.cfg.Configuration;

   public class HibernateUtil {
       private static final SessionFactory sessionFactory = buildSessionFactory();

       private static SessionFactory buildSessionFactory() {
           try {
               return new Configuration().configure().buildSessionFactory();
           } catch (Throwable ex) {
               throw new ExceptionInInitializerError(ex);
           }
       }

       public static SessionFactory getSessionFactory() {
           return sessionFactory;
       }
   }
   ```

4. **Main Class (Main.java)**:
   ```java
   import org.hibernate.Session;
   import org.hibernate.Transaction;

   public class Main {
       public static void main(String[] args) {
           Session session = HibernateUtil.getSessionFactory().openSession();
           Transaction transaction = session.beginTransaction();

           Employee employee = new Employee();
           employee.setName("John Doe");
           employee.setAge(30);

           session.save(employee);

           transaction.commit();
           session.close();
       }
   }
   ```

### JPA ve Hibernate Arasındaki Farklar

1. **Standart ve Araç**: JPA bir standarttır, Hibernate ise bu standardı uygulayan bir araçtır.
2. **Ek Özellikler**: Hibernate, JPA'nın sunduğu temel özelliklerin yanı sıra birçok gelişmiş özellik sunar.
3. **Konfigürasyon ve Kullanım**: Hibernate'in kendi konfigürasyon dosyaları ve API'leri vardır, ancak aynı zamanda JPA anotasyonları ve EntityManager API'si ile de kullanılabilir.

### Özet

- **JPA**: Java platformu için bir ORM standardıdır ve farklı JPA sağlayıcıları tarafından uygulanır.
- **Hibernate**: Popüler bir ORM aracıdır ve aynı zamanda JPA sağlayıcısı olarak da kullanılabilir. Hibernate, JPA standartlarını destekler ve ek özellikler sunar.

JPA ve Hibernate birlikte kullanıldığında, JPA'nın standart API'si ve Hibernate'in ek özelliklerinden yararlanılarak daha esnek ve güçlü bir veri erişim katmanı oluşturulabilir.