3.1 Menghubungkan Hibernate dan Database

Kami belajar cara menghubungkan Hibernasi ke aplikasi kami menggunakan Maven, dan cara memetakan tabel ke kelas menggunakan anotasi. Dan sekarang muncul pertanyaan berikutnya - bagaimana kita membaca objek dari database atau menyimpannya di sana?

Tidak terlalu cepat. Pertama-tama, Anda perlu berurusan dengan tiga hal lagi:

  • Konfigurasi koneksi database
  • Menyiapkan Hibernasi
  • Bekerja dengan EntityManager

Hibernasi sepenuhnya menyembunyikan pekerjaan dengan database dari aplikasi Anda, tetapi untuk menghindari ekses apa pun, itu harus dikonfigurasi dengan benar. Anda tidak dapat melewati tahap ini - jika tidak, bagaimana Hibernate akan mengetahui database mana yang akan digunakan untuk menyimpan objek?

Hibernate dapat dikonfigurasi dan diberikan informasi database dalam tiga cara

  • Gunakan file Properti
  • Gunakan file hibernate.cfg.xml
  • Gunakan metode Kacang konfigurasi

Dan meskipun saya paling suka yang terakhir, Anda pasti akan menemukan ketiganya, jadi kami akan menganalisis ketiganya di sini.

3.2 Otorisasi dalam database

Mari kita mulai dengan yang paling penting - koneksi basis data. Untuk melakukan ini, Anda perlu menyediakan data agar Hibernate dapat masuk ke database yang diinginkan.

Konfigurasi File Properti
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

Pengaturan yang sama dapat diatur dalam bentuk file xml:

Konfigurasi Berbasis 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 contoh, kami melihat pengaturan yang sama dengan nilai yang sama. Hanya saja contoh pertama merepresentasikannya sebagai file properti , dan yang kedua sebagai file xml .

Pengaturan ini dibagi menjadi tiga kelompok:

  1. Tentukan jenis DBMS
    • Tentukan dialek (tipe DBMS), misalnya, Oracle 9.0
    • Tentukan nama driver JDBC untuk bekerja dengan DBMS ini
  2. Tentukan data untuk otorisasi dalam database
    • url basis data
    • nama belakang
    • kata sandi
  3. Mengonfigurasi Mesin Hibernasi
    • hibernate.show_sql- Hibernasi akan menggandakan di konsol semua permintaan yang dijalankannya
    • hbm2ddl.auto- Hibernate akan mengubah struktur database jika perlu

Ada cara ketiga untuk mengatur konfigurasi - melalui tempat sampah. Ini biasanya digunakan bersamaan dengan Spring, jadi kita akan melihatnya ketika kita mempelajari SpringFramework.

3.3 Dapatkan SessionFactory

Langkah selanjutnya adalah mendapatkan objek SessionFactory. Ada beberapa cara untuk melakukan ini:

Cara pertama adalah dengan menggunakan file hibernate.properties .

Untuk melakukan ini, Anda hanya perlu menulis kode berikut:

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

Jika file hibernate.properties tidak ditemukan di direktori proyek saat ini, pengecualian akan dilemparkan.

Cara kedua adalah konfigurasi menggunakan hibernate.cfg.xml .

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

Jika Anda menulis kode seperti itu, maka file hibernate.cfg.xml. Jika tidak ada file seperti itu ditemukan, metode ini buildSessionFactory()akan mengeluarkan pengecualian.

Cara ketiga adalah mengatur file konfigurasi secara manual .

Kadang-kadang selama proses pengembangan, perlu beralih ke basis pengujian atau mengubah beberapa pengaturan lain untuk bekerja dengan basis, untuk ini Anda dapat mengatur file konfigurasi secara manual:

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

Metode empat - kami menggunakan file hibernate.properties khusus:

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

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

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

Dan terakhir, Anda cukup menjahit semua parameter yang diperlukan langsung ke dalam kode:

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 di mana mencari kelas Entitas

Tapi itu belum semuanya. Saat kami mengonfigurasi objek SessionFactory di Hibernate, SessionFactory ini memeriksa apakah semua tabel yang diperlukan dengan tipe kolom yang diperlukan ada di database.

Dan agar SessionFactory dapat melakukan ini, perlu diberikan daftar kelas entitas yang perlu dipetakan ke database.

Ada tiga cara untuk melewati daftar kelas entitas:

Metode satu. Di hibernate.cfg.xmltambahkan 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" />

Metode dua. Panggil metode pada objek KonfigurasiaddAnnotatedClass() . Contoh:

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

Jika ada banyak kelas, maka Anda dapat menambahkannya ke seluruh paket:

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

3.5 Contoh terakhir

Sekarang setelah kita mempelajari cara mengonfigurasi objek SessionFactory, mari tulis kode yang akan menggunakannya.

Ini akan terdiri dari tiga metode:

  1. Konfigurasi Hibernasi
  2. Metode yang mendapatkan semua karyawan dari database
  3. Metode yang menyimpan karyawan baru ke database

Templat kode ini akan terlihat 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 mengeksekusi kueri ke database, Anda perlu membuat sesi terpisah. Jika permintaan terkait, maka permintaan tersebut dapat dieksekusi di sesi yang sama. Jika permintaan tidak terkait (dan beberapa menit dapat berlalu di antara keduanya), maka mereka perlu membuat sesi sendiri.

Jika Anda ingin membaca data dari database atau menjalankan kueri kompleks, Anda harus terlebih dahulu membuat objek Kueri dan menggunakannya untuk mengeksekusi kueri Anda.

Juga, setiap kueri ke database dieksekusi dalam transaksinya sendiri. Anda perlu membukanya, melakukan operasi yang diperlukan, lalu menutup (melakukan).

Dalam kuliah berikut, kami akan menganalisis secara lebih rinci bagaimana semua ini bekerja.