Изучение гибких параметров конфигурации для беспрепятственной интеграции Hibernate в ваши Java-приложения

Хорошо, давайте начнем с самого распространенного вопроса, который может прийти вам в голову,

Что такое спящий режим?

Hibernate — это инструмент объектно-реляционного отображения (ORM) для языка программирования Java. Проще говоря, Hibernate помогает отображать классы Java на таблицы базы данных и наоборот. Это помогает сократить задачи разработчика, связанные с сохранением данных. Это реализация Java Persistence API (JPA), соответствующая общим стандартам API. Вы спросите, что такое JPA? Для этого следите за новостями в следующих блогах, а пока вы можете ознакомиться с оригинальной документацией Oracle, нажав здесь.

Какие существуют способы настройки Hibernate?

Итак, здесь я собираюсь показать вам три способа сделать это (помните, что я не собираюсь касаться способа Spring/Spring Boot, давайте пока остановимся на ядре Java).

Перво-наперво, давайте создадим новую Java-программу.

Теперь откройте файл pom.xml и добавьте следующие зависимости. Здесь я добавил две зависимости: коннектор mysql и основной спящий режим. Обратите внимание, что здесь я использую MySQL в качестве базы данных, и, следовательно, добавлен коннектор mysql, вы можете использовать любую другую базу данных, но обязательно добавьте соответствующие зависимости. Также, пожалуйста, проверьте версии один раз в репозитории Maven, он обновляется каждые несколько месяцев/недель.

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>6.2.3.Final</version>
        </dependency>
</dependencies>

Вот и все! Теперь Hibernate готов к настройке и использованию с базой данных MySQL. Хорошо, теперь давайте проверим первый способ настройки Hibernate —

1. XML-способ

Это наиболее распространенный способ настройки Hibernate. Почти все учебники в Интернете говорят об этом методе. Здесь я собираюсь создать XML-файл (о чем вы, должно быть, уже догадались!) и поместить все конфигурации в этот файл. Позже я обращусь к этому файлу из программы на Java. Давайте погрузимся и посмотрим, как это сделать на самом деле.

Первый шаг — создать файл XML в папке resources проекта (src-›main-›resources-›hibernate.cfg.xml). Имя файла по умолчанию — «hibernate.cfg.xml», и я оставлю то же имя (в этом есть преимущество, вы узнаете об этом позже), но вы можете оставить любое имя файла, но убедитесь, что расширение .xml.

Затем откройте файл и добавьте следующую конфигурацию

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <!-- For Oracle SQL use oracle.jdbc.driver.OracleDriver as the driver-->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- For Oracle SQL use  org.hibernate.dialect.OracleDialect as the dialect-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Example url for reference: dbc:mysql://localhost:3306/project_schema_db?useSSL=false -->
        <property name="connection.url">jdbc:mysql://<host>:<port>/<db_name>?useSSL=false</property>
        <property name="connection.username">db_username</property>
        <property name="connection.password">db_password</property>

        <!-- When it's true, every query executed by hibernate will be shown in the console-->
        <property name="show_sql">true</property>

        <!--Setting session context model -->
        <property name="current_session_context_class">thread</property>

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

Наконец, давайте создадим класс Java, из которого я заставлю hibernate использовать этот XML-файл для получения свойств конфигурации. Здесь я создал простой класс с основным методом внутри, а затем внутри основного метода я создал фабрику сеансов. Ниже приведен код,

package com.hibernatepractice.driver;

import com.hibernatepractice.entities.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class MainDriver {

    public static void main(String[] args) {
        
        //.configure() fetches the xml file automatically when default file name is used(hibernate.cfg.xml)
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        
        try{
           //add your hibernate code to manipulate data 
        }finally {
            session.close();
            sessionFactory.close();
        }
    }
}

Помните, я упоминал ранее, что сохранение имени файла XML по умолчанию дает определенные преимущества? В методе configure() мы фактически должны передать имя файла конфигурации, например configure(“somefile.xml”). Но если мы сохраним имя по умолчанию, тогда не требуется снова явно указывать имя файла в методе, отсюда и преимущество!

Это оно!! Спящий режим настраивается с использованием XML!! Теперь давайте перейдем ко второму способу настройки.

2. Использование файла свойств

Вместо использования файла XML мы также можем использовать файл свойств, и это второй способ, который я собираюсь обсудить сейчас. В папке resources(src-›main-›resources) создайте новый файл свойств, имя файла может быть любым (к сожалению, имя файла по умолчанию здесь не работает), я назову этот файл database.properties.

Следующим шагом является открытие файла и добавление следующих свойств, вы можете легко связать их с содержимым файла XML.

hibernate.connection.url = jdbc:mysql://localhost:3306/practiceschema_db?useSSL=false
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.username = root
hibernate.connection.password = root
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.current_session_context_class = thread
hibernate.show_sql = true

Теперь последний шаг, вызовите этот файл свойств из программы Java. Код останется более или менее прежним. Сначала я загружу файл свойств в объект Properties, а затем изменю метод configure() на addProperties() и передам свойство в качестве аргумента внутри.

package com.hibernatepractice.driver;

import com.hibernatepractice.entities.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;

public class MainDriver {

    public static void main(String[] args) {
        Properties prop = new Properties();

        try {
            
            //Note that we are required to provide the full path of the file starting from the base directory
            //which is src for every project
            FileReader file = new FileReader("src/main/resources/database.properties");
            prop.load(file);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        
        //Using addProperties() instead of configure()
        SessionFactory sessionFactory = new Configuration().addProperties(prop).addAnnotatedClass(User.class).buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        
        try{
           //add your hibernate code to manipulate data
        }finally {
            session.close();
            sessionFactory.close(); 
        }
    }
}

Это был второй способ сделать это. Теперь давайте перейдем к третьему пути, и это будет последний путь.

3. Программная конфигурация (помещение всего в код Java)

Для этого метода не требуется создавать никаких внешних файлов, я все положу внутрь Java. В основном я создаю объект Properties и вместо загрузки файла свойств устанавливаю свойства непосредственно в объекте в виде пар ключ-значение. Проверьте код ниже,

package com.hibernatepractice.driver;

import com.hibernatepractice.entities.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;

public class MainDriver {

    public static void main(String[] args) {
        Properties prop = new Properties();
        prop.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/project_schema_db?useSSL=false");
        prop.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        prop.setProperty("hibernate.connection.username","root");
        prop.setProperty("hibernate.connection.password","Dangerous123");
        prop.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver");
        prop.setProperty("hibernate.show_sql","true");
        prop.setProperty("hibernate.current_session_context_class","thread");

        SessionFactory sessionFactory = new Configuration().addProperties(prop).addAnnotatedClass(User.class).buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();

        try{
          //add your hibernate code to manipulate data
        }finally {
            session.close();
            sessionFactory.close();
        }
    }

}

Итак, это третий и последний способ ведения дел.

Заключение

Здесь я обсудил три разных способа настройки Hibernate. Первые два способа включают использование внешнего файла, а третий способ включает все содержимое файла Java. Хотя может показаться заманчивым использовать третий способ, учитывая его простоту, я бы рекомендовал иначе. Никогда не рекомендуется помещать имена пользователей и пароли непосредственно в класс Java и предоставлять его. Поэтому я бы посоветовал никогда не использовать третий способ в реальном проекте, я включил третий способ только для вашего сведения. Всегда идите первым или вторым путем.

Что ж, статья стала немного длинноватой, но, надеюсь, я смог ясно изложить свою мысль. В случае каких-либо сомнений или вопросов, или если вы хотите, чтобы я изменил/убрал/добавил что-то, пожалуйста, дайте мне знать в комментариях.

Ваше здоровье!!!!

Спасибо, что дочитали до конца. Пожалуйста, следите за автором и этой публикацией. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное обучение программированию по всему миру.