3.1 Свързване на Hibernate и бази данни

Научихме How да свързваме Hibernate с нашето приложение с помощта на Maven и How да картографираме таблици към класове с помощта на анотации. И сега възниква следващият въпрос - How да четем обекти от базата данни or да ги записваме там?

Не толкова бързо. На първо място, трябва да се справите с още три неща:

  • Конфигуриране на връзка с база данни
  • Настройка на хибернация
  • Работа с EntityManager

Hibernate напълно скрива работата с базата данни от вашето приложение, но за да избегнете излишъци, тя трябва да бъде конфигурирана правилно. Не можете да пропуснете този етап - в противен случай How Hibernate ще разбере в коя база данни да запише обектите?

Hibernate може да се конфигурира и да се дава информация за базата данни по три начина

  • Използвайте file със свойства
  • Използвайте file hibernate.cfg.xml
  • Използвайте конфигурационни bean методи

И въпреки че последният ми харесва най-много, определено ще срещнете и трите, така че ще анализираме и трите тук.

3.2 Authorизация в базата данни

Нека започнем с най-важното – връзките към бази данни. За да направите това, ще трябва да предоставите данни, за да може Hibernate да влезе в желаната база данни.

Конфигурация на файл със свойства
хибернация.свойства
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

Същите настройки могат да бъдат зададени под формата на xml файл:

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>

И в двата примера виждаме едни и същи настройки с едни и същи стойности. Просто първият пример ги представя като файл със свойства , а вторият като xml файл .

Тези настройки са разделени на три групи:

  1. Посочете типа СУБД
    • Посочете диалекта (тип СУБД), например Oracle 9.0
    • Посочете името на JDBC драйвера за работа с тази СУБД
  2. Посочете данни за оторизация в базата данни
    • url на база данни
    • потребителско име
    • парола
  3. Конфигуриране на Hibernate Engine
    • hibernate.show_sql- Hibernate ще дублира в конзолата всички заявки, които изпълнява
    • hbm2ddl.auto- Hibernate ще промени структурата на базата данни, ако е необходимо

Има и трети начин за настройка на конфигурацията - чрез кошчета. Обикновено се използва заедно с Spring, така че ще го разгледаме, когато научим SpringFramework.

3.3 Вземете SessionFactory

Следващата стъпка е да получите обекта SessionFactory. Има няколко начина да направите това:

Първият начин е да използвате file hibernate.properties .

За да направите това, просто трябва да напишете следния code:

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

Ако файлът hibernate.properties не бъде намерен в текущата директория на проекта, ще бъде хвърлено изключение.

Вторият начин е конфигуриране чрез hibernate.cfg.xml .

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

Ако напишете такъв code, тогава hibernate.cfg.xml. Ако не бъде намерен такъв файл, методът buildSessionFactory()ще хвърли изключение.

Третият начин е да настроите конфигурационния файл ръчно .

Понякога по време на процеса на разработка става необходимо да преминете към тестова база or да промените някои други настройки за работа с базата, за това можете да зададете конфигурационния файл ръчно:

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

Метод четири - използваме персонализиран файл hibernate.properties:

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

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

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

И накрая, можете просто да зашиете всички необходими параметри директно в codeа:

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

Но това не е всичко. Когато конфигурираме обект SessionFactory в Hibernate, този SessionFactory проверява дали всички необходими таблици с необходимите типове колони съществуват в базата данни.

И за да може SessionFactory да направи това, трябва да му бъде предаден списък от класове обекти, които трябва да картографира към базата данни.

Има три начина за предаване на списък от класове обекти:

Метод първи. В hibernate.cfg.xmlдобавете ред като:

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

Пример:

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

Метод втори. Извикайте метода на обекта ConfigurationaddAnnotatedClass() . Пример:

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

Ако има много класове, тогава можете да ги добавите в цели пакети:

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

3.5 Последен пример

Сега, след като научихме How да конфигурираме обекта SessionFactory, нека напишем codeа, който ще го използва.

Тя ще се състои от три метода:

  1. Конфигуриране на хибернация
  2. Метод, който извлича всички служители от базата данни
  3. Метод, който записва нов служител в базата данни

Този шаблон на code ще изглежда така:

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

Преди да изпълните заявка към базата данни, трябва да създадете отделна сесия. Ако заявките са свързани, тогава те могат да бъдат изпълнени в една и съща сесия. Ако заявките не са свързани (и могат да минат няколко minutesи между тях), тогава те трябва да направят свои собствени сесии.

Ако искате да прочетете данни от базата данни or да изпълните сложна заявка, първо трябва да създадете обект Query и да го използвате, за да изпълните вашата заявка.

Освен това всяка заявка към базата данни се изпълнява в собствена транзакция. Трябва да го отворите, да извършите необходимите операции и след това да затворите (комит).

В следващите лекции ще анализираме по-подробно How работи всичко това.