3.1 Menghubungkan Hibernate dan Pangkalan Data

Kami belajar cara menyambung Hibernate ke aplikasi kami menggunakan Maven, dan cara memetakan jadual ke kelas menggunakan anotasi. Dan kini persoalan seterusnya timbul - bagaimana kita membaca objek dari pangkalan data atau menyimpannya di sana?

Tidak begitu pantas. Pertama sekali, anda perlu berurusan dengan tiga perkara lagi:

  • Mengkonfigurasi sambungan pangkalan data
  • Menyediakan Hibernate
  • Bekerja dengan EntityManager

Hibernate menyembunyikan sepenuhnya kerja dengan pangkalan data daripada aplikasi anda, tetapi untuk mengelakkan sebarang keterlaluan, ia mesti dikonfigurasikan dengan betul. Anda tidak boleh melangkau peringkat ini - jika tidak, bagaimanakah Hibernate akan mengetahui pangkalan data untuk menyimpan objek?

Hibernate boleh dikonfigurasikan dan diberi maklumat pangkalan data dalam tiga cara

  • Gunakan fail Properties
  • Gunakan fail hibernate.cfg.xml
  • Gunakan kaedah kacang Konfigurasi

Dan walaupun saya paling suka yang terakhir, anda pasti akan menemui ketiga-tiganya, jadi kami akan menganalisis ketiga-tiganya di sini.

3.2 Kebenaran dalam pangkalan data

Mari kita mulakan dengan yang paling penting - sambungan pangkalan data. Untuk melakukan ini, anda perlu menyediakan data supaya Hibernate boleh log masuk ke pangkalan data yang dikehendaki.

Konfigurasi Fail Properties
hibernate.properties
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

Tetapan yang sama boleh ditetapkan dalam bentuk fail xml:

Konfigurasi Berasaskan XML
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>

Dalam kedua-dua contoh, kita melihat tetapan yang sama dengan nilai yang sama. Cuma contoh pertama mewakilinya sebagai fail sifat , dan yang kedua sebagai fail xml .

Tetapan ini dibahagikan kepada tiga kumpulan:

  1. Nyatakan jenis DBMS
    • Tentukan dialek (jenis DBMS), contohnya, Oracle 9.0
    • Nyatakan nama pemacu JDBC untuk bekerja dengan DBMS ini
  2. Tentukan data untuk kebenaran dalam pangkalan data
    • url pangkalan data
    • nama pengguna
    • kata laluan
  3. Mengkonfigurasi Enjin Hibernate
    • hibernate.show_sql- Hibernate akan menduplikasi dalam konsol semua permintaan yang ia laksanakan
    • hbm2ddl.auto- Hibernate akan mengubah struktur pangkalan data jika perlu

Terdapat cara ketiga untuk menetapkan konfigurasi - melalui tong sampah. Ia biasanya digunakan bersama dengan Spring, jadi kami akan melihatnya apabila kami mempelajari SpringFramework.

3.3 Dapatkan SessionFactory

Langkah seterusnya ialah mendapatkan objek SessionFactory. Terdapat beberapa cara untuk melakukan ini:

Cara pertama ialah menggunakan fail hibernate.properties .

Untuk melakukan ini, anda hanya perlu menulis kod berikut:

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

Jika fail hibernate.properties tidak ditemui dalam direktori projek semasa, pengecualian akan dilemparkan.

Cara kedua ialah konfigurasi menggunakan hibernate.cfg.xml .

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

Jika anda menulis kod sedemikian, maka hibernate.cfg.xml. Jika tiada fail sedemikian ditemui, kaedah itu buildSessionFactory()akan membuang pengecualian.

Cara ketiga ialah menetapkan fail konfigurasi secara manual .

Kadang-kadang semasa proses pembangunan menjadi perlu untuk beralih ke pangkalan ujian atau menukar beberapa tetapan lain untuk bekerja dengan pangkalan, untuk ini anda boleh menetapkan fail konfigurasi secara manual:

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

Kaedah empat - kami menggunakan fail hibernate.properties tersuai:

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

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

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

Dan akhirnya, anda boleh menjahit semua parameter yang diperlukan terus ke dalam kod:

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 Tentukan tempat untuk mencari kelas Entiti

Tetapi bukan itu sahaja. Apabila kita mengkonfigurasi objek SessionFactory dalam Hibernate, SessionFactory ini menyemak bahawa semua jadual yang diperlukan dengan jenis lajur yang diperlukan wujud dalam pangkalan data.

Dan agar SessionFactory dapat melakukan ini, ia perlu lulus senarai kelas entiti yang perlu dipetakan ke pangkalan data.

Terdapat tiga cara untuk lulus senarai kelas entiti:

Kaedah satu. Dalam hibernate.cfg.xmlmenambah baris seperti:

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

Contoh:

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

Kaedah kedua. Panggil kaedah pada objek KonfigurasiaddAnnotatedClass() . Contoh:

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

Jika terdapat banyak kelas, maka anda boleh menambahnya dalam keseluruhan pakej:

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

3.5 Contoh terakhir

Sekarang kita telah mempelajari cara mengkonfigurasi objek SessionFactory, mari tulis kod yang akan menggunakannya.

Ia akan terdiri daripada tiga kaedah:

  1. Mengkonfigurasi Hibernate
  2. Kaedah yang mendapatkan semua pekerja daripada pangkalan data
  3. Kaedah yang menyimpan pekerja baru ke pangkalan data

Templat kod ini akan kelihatan seperti ini:

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();
     	}
   }
}

Sebelum melaksanakan pertanyaan kepada pangkalan data, anda perlu membuat sesi berasingan. Jika permintaan berkaitan, maka ia boleh dilaksanakan dalam sesi yang sama. Jika permintaan tidak berkaitan (dan beberapa minit boleh berlalu di antara mereka), maka mereka perlu membuat sesi mereka sendiri.

Jika anda ingin membaca data daripada pangkalan data atau melaksanakan pertanyaan yang kompleks, anda mesti mencipta objek Pertanyaan dan menggunakannya untuk melaksanakan pertanyaan anda.

Selain itu, setiap pertanyaan kepada pangkalan data dilaksanakan dalam transaksinya sendiri. Anda perlu membukanya, melakukan operasi yang diperlukan, dan kemudian tutup (komit).

Dalam kuliah berikut, kami akan menganalisis dengan lebih terperinci bagaimana ini semua berfungsi.