3.1 Hibernate ve Veritabanlarını Bağlama

Hibernate'i Maven kullanarak uygulamamıza nasıl bağlayacağımızı ve açıklamaları kullanarak tabloları sınıflarla nasıl eşleştireceğimizi öğrendik. Ve şimdi bir sonraki soru ortaya çıkıyor - nesneleri veritabanından nasıl okuyacağız veya onları oraya nasıl kaydedeceğiz?

Çok hızlı değil. Her şeyden önce, üç şeyle daha uğraşmanız gerekiyor:

  • Veritabanı bağlantısını yapılandırma
  • Hazırda Bekletmeyi ayarlama
  • EntityManager ile çalışmak

Hazırda bekletme, veritabanıyla çalışmayı uygulamanızdan tamamen gizler, ancak aşırılıkları önlemek için doğru şekilde yapılandırılması gerekir. Bu aşamayı atlayamazsınız - aksi halde Hazırda Bekletme, nesneleri hangi veritabanına kaydedeceğini nasıl bilecek?

Hazırda Bekletme üç şekilde yapılandırılabilir ve veritabanı bilgileri verilebilir

  • Özellikler dosyasını kullan
  • hibernate.cfg.xml dosyasını kullanın
  • Yapılandırma çekirdeği yöntemlerini kullanın

Ve en çok sonuncuyu sevsem de, kesinlikle üçüyle de karşılaşacaksınız, o yüzden burada üçünü de inceleyeceğiz.

3.2 Veritabanında yetkilendirme

En önemli veritabanı bağlantılarıyla başlayalım. Bunu yapmak için, Hibernate'in istenen veritabanında oturum açabilmesi için veri sağlamanız gerekecektir.

Özellikler Dosya Yapılandırması
hazırda bekletme özellikleri
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

Aynı ayarlar bir xml dosyası biçiminde de ayarlanabilir:

XML Tabanlı Yapılandırma
hibernate.cfg.xml
<hibernate-configuration>
	<session-factory>

    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>
    	<property name="hbm2ddl.auto">update</property>

	</session-factory>
</hibernate-configuration>

Her iki örnekte de aynı ayarları aynı değerlerle görüyoruz. Sadece ilk örnek onları bir özellikler dosyası olarak , ikincisi ise bir xml dosyası olarak temsil ediyor .

Bu ayarlar üç gruba ayrılır:

  1. VTYS türünü belirtin
    • Lehçeyi (DBMS türü) belirtin, örneğin Oracle 9.0
    • Bu DBMS ile çalışmak için JDBC sürücüsünün adını belirtin
  2. Veritabanında yetkilendirme için verileri belirtin
    • veritabanı url'si
    • Kullanıcı adı
    • şifre
  3. Hazırda Bekleme Motorunu Yapılandırma
    • hibernate.show_sql- Hazırda bekletme, yürüttüğü tüm istekleri konsolda çoğaltır
    • hbm2ddl.auto- Hazırda bekletme, gerekirse veritabanı yapısını değiştirir

Yapılandırmayı ayarlamanın üçüncü bir yolu vardır - bölmeler aracılığıyla. Genellikle Spring ile birlikte kullanılır, bu yüzden SpringFramework'ü öğrendiğimizde ona bakacağız.

3.3 SessionFactory'yi Alın

Bir sonraki adım, SessionFactory nesnesini elde etmektir. Bunu yapmanın birkaç yolu vardır:

İlk yol hibernate.properties dosyasını kullanmaktır .

Bunu yapmak için aşağıdaki kodu yazmanız yeterlidir:

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

Hibernate.properties dosyası geçerli proje dizininde bulunmazsa, bir istisna atılır.

İkinci yol ise hibernate.cfg.xml kullanarak yapılandırmadır .

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Böyle bir kod yazarsanız, hibernate.cfg.xml. Böyle bir dosya bulunamazsa, yöntem buildSessionFactory()bir istisna atar.

Üçüncü yol, yapılandırma dosyasını manuel olarak ayarlamaktır .

Bazen geliştirme sürecinde bir test tabanına geçmek veya bazla çalışmak için diğer bazı ayarları değiştirmek gerekli hale gelir, bunun için yapılandırma dosyasını manuel olarak ayarlayabilirsiniz:

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

Dördüncü yöntem - özel bir hibernate.properties dosyası kullanıyoruz:

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

Ve son olarak, gerekli tüm parametreleri doğrudan koda dikebilirsiniz:

Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");

SessionFactory sessionFactory = new Configuration()
            .setProperties(properties)
            .buildSessionFactory();

3.4 Entity sınıflarının nerede aranacağını belirtin

Ama hepsi bu kadar değil. Hibernate'de bir SessionFactory nesnesi yapılandırdığımızda , bu SessionFactory, veritabanında gerekli sütun tipleriyle gerekli tüm tabloların var olup olmadığını kontrol eder.

Ve SessionFactory'nin bunu yapabilmesi için , veritabanına eşlemesi gereken varlık sınıflarının bir listesini geçirmesi gerekir.

Varlık sınıfları listesini geçirmenin üç yolu vardır:

Birinci yöntem. hibernate.cfg.xmlŞunun gibi bir satır ekleyin :

<mapping class="class-qualified-name" />

Örnek:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

İkinci yöntem. Configuration nesnesindeki yöntemi çağırın addAnnotatedClass(). Örnek:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

Çok sayıda sınıf varsa, bunları tüm paketlere ekleyebilirsiniz:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 Son örnek

SessionFactory nesnesini nasıl yapılandıracağımızı öğrendiğimize göre, onu kullanacak kodu yazalım.

Üç yöntemden oluşacaktır:

  1. Hazırda Bekletmeyi Yapılandırma
  2. Tüm çalışanları veri tabanından alan yöntem
  3. Yeni bir çalışanı veritabanına kaydeden yöntem

Bu kod şablonu şuna benzer:

class EmployeeManager {
    private SessionFactory sessionFactory;

    public void class init() {
    	this.sessionFactory = new Configuration()
        	.configure()
        	.buildSessionFactory();
   }

   public List<Employee> getAllEmployes() {
         try (Session session = sessionFactory.openSession()) {
  	          Query<Employee> query = session.createQuery("from Employee", Employee.class);
    	        return query.list();
         }
   }

   public void addEmployee(Employee employee ) {
     	try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
       	    session.save(employee);
            transaction.commit();
     	}
   }
}

Veritabanına bir sorgu yürütmeden önce ayrı bir oturum oluşturmanız gerekir. İstekler ilişkiliyse, aynı oturumda yürütülebilirler. İstekler ilgisizse (ve aralarında birkaç dakika geçebilir), o zaman kendi oturumlarını yapmaları gerekir.

Veritabanından veri okumak veya karmaşık bir sorgu yürütmek istiyorsanız, önce bir Sorgu nesnesi oluşturmalı ve sorgunuzu yürütmek için onu kullanmalısınız.

Ayrıca, veritabanına yapılan her sorgu kendi işleminde yürütülür. Açmanız, gerekli işlemleri yapmanız ve ardından kapatmanız (commit) gerekir.

Sonraki derslerde, tüm bunların nasıl çalıştığını daha ayrıntılı olarak analiz edeceğiz.