Arkadaşlar merhaba.

Hibernate ve JPA kullanarak, veri tabanında tablo oluşturmayı ve basitçe işlemler yapmayı göstereceğim.
Veri tabanı olarak MySQL, proje yöneticisi olarak da Maven kullanacağız.

İlk önce içinde Lombok'u da ekleyeceğim bağımlılıkları Maven dosyanıza ekleyin
XML:
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.5.1.Final</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.32</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>


        <!--
        https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.15.Final</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!--
        https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>6.5.1.Final</version>
            <type>pom</type>
        </dependency>


Daha sonra da bu konudaki hazır XML dosyasını alın, projenizedeki /src/main/resources dizinine atın.
BU XML dosyası içindeki bazı alanları kendinize göre düzenleyin. MySQL için yapılandırılmıştı ve MySQL sürücüleri eklidir.
Değiştirelecek alanlar;

1. <persistence-unit name="persistenceUnitMySQL"
transaction-type="RESOURCE_LOCAL">

Buraya dilediğiniz ismi verin. Daha sonra bu ismi kullanacağız.

2. <class>model.Student</class>
Burada Entityler ya da modellerimiz belirtilmeli. Kaç tane varsa modeliniz ya da Entity'nin varsa onları alt alta <class> tagları açarak ekleyin.
<class>model.Student</class>
<class>model.Teacher</class>
...
...

3. Veri tabanı bilgilerinizi düzenleyin.

Veri tabanı adresi:
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/school" />

Veri tabanı kullanıcı ismi
<property name="javax.persistence.jdbc.user" value="root" />
Veri tabanı kullanıcı Şifresi
<property name="javax.persistence.jdbc.password" value="1234" />


4. Tablo oluşturma yöntemi belirleyin.
Create: Veri tabanında tüm tabloları siler ve yeniden oluşturur.
Update: Var olan tablo üzerine güncelleme yapar.
<property name="hibernate.hbm2ddl.auto" value="create" />

Diğer özellikleri, XML dosyası üzerinde yorum satırı olarak yazıyor. İnceleyebilirsiniz.



Şimdi ilk önce model oluşturulım. Model oluşturuken olması ve yapılaması önerilen kurallar şunlardır;

1. Modelleri Entitiy ve Table olarak işaretleyin.
2. Modelin bir değişkenini JPA kullanarak Id olarak işaretleyin


JPA (Javax.persistence.api ya da yeni adı Jakarta.persistence.api) kütüphanesine ait Entity işareti, bunun bir tablo olacağını, Id işareti de bunun Primary Key olacağını belirtir.
Oluşturduğunuz modelleri ya da entityleri, XML'de bahsettiğim yere belirtin.

Şimdi Entity oluşturalım;
Java:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student{
    @Id
    private int id;
    private String name;
    private String surname;
    // Öğrenciyi tanımlayan diğer değişkenler

}

Bu hali ile veritabanda tablo oluştururken;
Tablo adı: Student olur. Column isimleri de değişkenleri isimleri olur.
İsterseniz buradan isimleri değiştirebilirsiniz.
Yine çok farklı durumlarda, senaryolarda kullanılabilecek bir sürü durum vardır.
Örneğin Id olarak işaretlenen değişkenin, her yeni veri kaydında otomatik olarak tanımlanması,
belirtilen objelerin null geçilmemesi, ilişki türleri gibi ...

Şimdi veritabanı bağlantsını kuralım;

main fonksiyonumuzda sırayla şu adımları gerçekleştiriyoruz;
1. EntityManagerFabrikası nesnesi oluşturuyoruz. Bu fabrika, bizim yapılandırdığımız XML dosyasının <persistence-unit> etiketinin içinde name değerini alarak yapılandırılır.
Özünde bir "factory pattern" uygular ve bizim yapılandırmamıza göre EntityManager, Entity Transaction nesneleri oluşturmamazı sağlar.
2. Sonra bu fabrikanın oluşturduğu Entity Manager nesnesini çekiyoruz. EntityManager nesnesi ile veri tabanı işlemlerini yaparız.
3. Çektiğimiz bu manager'ın içinde de Entity Transaction nesnesini çekiyoruz. EntityTransaction nesnesi de işlemleri kaydetme veya bir hata durumunda işlemi geri almak için kullanırız.

Not: Bu nesnelerin hepsi JPA kütüphanesine aittir. JPA bizim yapılandırma dosyamıza göre nesneler oluşturur.

Java:
public static void main(String[] args){
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitMySQL");
    EntityManager entityManager = factory.createEntityManager();
    EntityTransaction transaction = entityManager.getTransaction();
}


Veri kaydedelim;
Java:
Student student = new Student(1, "Can", "Polat");
transaction.begin(); // Bir işlem başlat.
entityManager.persist(student); // Entity Mananger'ın persist metodu kaydeder.
transaction.commit(); // İşlemi sonuçla ve sonlandır.

ID'ye göre veri arayalım;
Kod:
Student student1 = entityManager.find(Student.class, 1);
// EntityManager find metodu, veriyi çeker. Bulamazsa kod patlamaz, null döndürür.
// Parametre olarak modeli ve id'yi tipine göre gönderir.

Veri güncelleme;
Java:
// Öğrenci bulma
Student student1 = entityManager.find(Student.class, "1");
   
student1.setSurname("Kral"); // Öğrenci bilgileri güncelleme


transaction.begin(); // Transaction başlangıcı  
entityManager.merge(student1);
/* Merge metotdu, parametre olarak veriyi direkt alır,
tabloda karşılak gelen veriyi bulur ve onu günceller.
*/
transaction.commit(); // Transaction bitişi

Silme işleml;
Java:
// Veriyi bul
Student student1 = entityManager.find(Student.class, 1);

transaction.begin(); //Transaction başlangıcı
 
entityManager.remove(student1);
/* Entity Manager remove metodu,
paremetre olarak direkt veriyi alır ve silme işlemi yapar.
*/

transaction.commit();// Transaction bitişi

Hibernate, SQL'e yakın veya uzak kendi dili olan HQL diliyle işlemler yaparak veritabanında işlemleri gerçekleştirir. Hibernate, işlemleri veritabanının anlayacağı dile dönüştürür ve bu dille uyumlu şekilde veritabanı işlemlerini gerçekleştirir. Bu sayede, tek bir dil kullanarak birçok farklı veritabanında işlem yapabilir. Genelde NoSQL olmayan birçok veritabanında kullanılır. Hibernate bu kısımda JPA tarafından yönetilir. SQL ve HQL diline ihtiyacı azaltır veya sıfıra indirebilir.
JPA, Hibernate ile ilgili gerekli nesneleri veya bağımlılıkları, işlem sırasında otomatik üretir ve kullanılır.
Buralara bir şekilde müdahale edilebilir lakin bunun yerine modellerin işaretlerini ve özelliklerini yapılandırmak daha anlamlı olur.
 
Son düzenleyen: Moderatör: