Hibernate & JPA Anotasyonu Kullanımı

Hibernate, bir ORM (Object-Relational Mapping) çerçevesidir ve veritabanı işlemlerini nesne yönelimli bir yaklaşımla yapmayı sağlar. JPA (Java Persistence API) ise, Java EE platformunda bir ORM standardıdır. Hibernate, JPA standardını uygular ve JPA API’lerini kullanarak veritabanı işlemlerini gerçekleştirir.

Hibernate ve JPA, bir dizi anotasyon kullanarak veritabanı işlemlerini yönetir. Anotasyonlar, Java sınıflarına ve sınıf öğelerine eklenen özel etiketlerdir. Bu anotasyonlar, Hibernate ve JPA’nın veritabanı işlemleri için gerekli bilgileri elde etmesini sağlar.

Hibernate ve JPA’da kullanılan bazı önemli anotasyonlar şunlardır:

  1. @Entity: Bu anotasyon, bir sınıfın bir JPA varlığı olduğunu belirtir.
  2. @Table: Bu anotasyon, bir varlığın veritabanında hangi tabloya karşılık geldiğini belirtir.
  3. @Id: Bu anotasyon, bir varlık sınıfının anahtar alanını belirtir.
  4. @GeneratedValue: Bu anotasyon, bir anahtar alanının otomatik olarak oluşturulacağını belirtir.
  5. @Column: Bu anotasyon, bir sınıf alanının veritabanındaki bir sütunla eşleştiğini belirtir.
  6. @OneToMany: Bu anotasyon, bir varlığın başka bir varlıkla birçok ilişkisi olduğunu belirtir.
  7. @ManyToOne: Bu anotasyon, bir varlığın başka bir varlıkla birçoktan bir ilişkisi olduğunu belirtir.

Örneğin, bir kullanıcı sınıfı ve bu sınıfa bağlı bir adres sınıfı olduğunu varsayalım. Bu sınıflar arasında birçok ilişki var. Kullanıcılar tablosu kullanıcıların adını, soyadını ve doğum tarihini içerirken, adresler tablosu kullanıcılara ait adres bilgilerini içerir.

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "birth_date")
private Date birthDate;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Address> addresses;

// getters and setters
}
@Entity
@Table(name = "addresses")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "address_id")
private Long id;

@Column(name = "street")
private String street;

@Column(name = "city")
private String city;

@Column(name = "zip_code")
private String zipCode;

@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}}

Tablolarımızı oluşturmak için bir veritabanı yönetim sistemi (DBMS) kullanıyoruz. Örneğin, MySQL kullanarak aşağıdaki SQL betiğini kullanarak tabloları oluşturabiliriz:

sql kodu;

CREATE TABLE users (
  user_id BIGINT NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(255) NOT NULL,
  last_name VARCHAR(255) NOT NULL,
  birth_date DATE NOT NULL,
  PRIMARY KEY (user_id)
);

CREATE TABLE addresses (
  address_id BIGINT NOT NULL AUTO_INCREMENT,
  street VARCHAR(255) NOT NULL,
  city VARCHAR(255) NOT NULL,
  zip_code VARCHAR(10) NOT NULL,
  user_id BIGINT NOT NULL,
  PRIMARY KEY (address_id),
  FOREIGN KEY (user_id) REFERENCES users (user_id)
);

Bu tabloları kullanarak, Hibernate ve JPA kullanarak veritabanı işlemleri yapabiliriz. Örneğin, yeni bir kullanıcı ve adres eklemek için aşağıdaki kodu kullanabiliriz:

// EntityManagerFactory oluşturma
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");

// EntityManager oluşturma
EntityManager em = emf.createEntityManager();

// Kullanıcı oluşturma
User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
user.setBirthDate(new Date());

// Adres oluşturma
Address address = new Address();
address.setStreet("123 Main St");
address.setCity("Anytown");
address.setZipCode("12345");

// Kullanıcının adresler listesine adresi ekleyin
user.getAddresses().add(address);
address.setUser(user);

// Kullanıcıyı veritabanına kaydetme
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(user);
transaction.commit();

// EntityManager ve EntityManagerFactory kapatma
em.close();
emf.close();

Bu kod, kullanıcıyı ve adresi veritabanına kaydeder. Ayrıca, kullanıcının adresler listesine adresi ekler ve ilişkiyi oluşturur. Ayrıca, veritabanından veri almak için aşağıdaki kodu kullanabiliriz:

// EntityManagerFactory oluşturma
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");

// EntityManager oluşturma
EntityManager em = emf.createEntityManager();

// Kullanıcı sorgulama
TypedQuery<User> query = em.createQuery("SELECT u FROM User u WHERE u.firstName = :firstName", User.class);
query.setParameter("firstName", "John");
List<User> users = query.getResultList();

// Sonuçları yazdırma
for (User user : users) {
    System.out.println(user.getFirstName() + " " + user.getLastName());
    for (Address address : user.getAddresses()) {
        System.out.println(address.getStreet() + ", " + address.getCity() + " " + address.getZipCode());
    }
}

// EntityManager ve EntityManagerFactory kapatma
em.close();
emf.close();

Bu kod, veritabanından “John” adlı kullanıcının verilerini alır ve sonuçları yazdırır. Bu örnekte, kullanıcının adı ve soyadı yanı sıra adresleri de yazdırılır.

Yorum bırakın