Hibernate — библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping — ORM). Данная библиотека предоставляет лёгкий в использовании каркас (фреймворк) для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных.

В двух словах ORM — это отображение объектов какого-либо объектно-ориентированного языка в структуры реляционных баз данных. Именно объектов, таких, какие они есть, со всеми полями, значениями, отношениями и так далее.

Hibernate значительно уменьшает время разработки приложений, работающих с базами данных, заботится о связи Java классов с таблицами базы данных (и типов данных Java в типы данных SQL), предоставляет средства для автоматического построения запросов и извлечения данных.

Давайте напишем небольшое приложение, использующее библиотеку Hibernate для хранения и обработки таблицы СУБД Oracle. Для начала нам нужно скачать Hibernate. На момент написания статьи последняя версия была Hibernate 4.1 и работать мы будем именно с ней. Не пугайтесь, если библиотека будет весить много, скорей всего в нее вставили помимо прочего документацию и различные примеры использования.

Также нам понадобиться скачать и установить СУБД Oracle. В данном примере я буду использовать Oracle 10.2, но вы можете установить более новую версию, особой разницы не будет. После установки Oracle создайте пользователя и базу данных с каким-нибудь именем, например, MyDB.

В базе данных создадим простенькую табличку Student с тремя полями:

1) id — идентификатор

2) name — имя студента

3) age — его возраст

Для тех, кто еще не знает как в Oracle создавать таблицы:

CREATE TABLE Student(id NUMBER(10) NOT NULL,name varchar2(100) NOT NULL, age NUMBER(3) NOT NULL, CONSTRAINT pk_Student PRIMARY KEY(id));

 

Работа с Oracle закончена, перейдем в Eclipse. Создайте новый java project, дайте ему имя, скажем, HibernateSimpleExample. Добавляем в него нашу библиотеку с помощью Build Path -> Configure Build Path -> Add External JARs. Выбираем все jar файлы из папки lib нашей библиотеки. Также Hibernate для работы с Oracle конкретной версии требует специальный jdbc драйвер, который можно найти здесь. Скачивайте и добавляйте его в проект тем же способом.

 

Ближе к коду! Для начала создайте пакет logic. В нем мы опишем наш класс-сущность, который будем хранить в БД:

 

package logic;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="Student")
public class Student {
   
    private Long id;    
    private String name;    
    private Long age;
   
    public Student(){
        name = null;
    }
   
    public Student(Student s){
        name = s.getName();
    }  
   
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name="id")
    public Long getId() {
        return id;
    }
   
    @Column(name="name")
    public String getName(){
        return name;
    }
   
    @Column(name="age")
    public Long getAge(){
        return age;
    }
   
    public void setId(Long i){
        id = i;    
    }
   
    public void setName(String s){
        name = s;
    }  
   
    public void setAge(Long l){
        age = l;
    }  
}

 

Аннотации здесь используются для Mapping (сопоставление) Java классов с таблицами базы данных. Проще говоря для того, чтобы Hibernate знал, что данный класс является сущностью, то есть объекты данного класса мы будем хранить в базе данных. Использованные здесь аннотации имеют следующий смысл:

 

@Entity — указывает на то, что данный класс является сущностью.

 

@Table — задает имя таблицы, в которой будут храниться объекты класса

 

@Id — обозначает поле id

 

@GeneratedValue и @GenericGenerator — указывает на то, как будет генерироваться id (у нас — по возрастанию)

 

@Column — обозначает имя колонки, соответствующей данному полю.

 

Стоит отметить также, что все классы-сущности должны обязательно иметь геттеры, сеттеры и конструктор по умолчанию.

 

Теперь создадим главный конфигурационный файл hibernate.cfg.xml и помести его в папку bin нашего проекта. Из этого файла Hibernate будет брать всю необходимую ему информацию:

 

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:MyDB</property>  
    <property name="connection.username">Your_Login</property>
    <property name="connection.password">Your_Password</property>
    <property name="connection.pool_size">10</property>
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="hibernate.connection.autocommit">false</property>
    <property name="current_session_context_class">thread</property>

    <mapping class="logic.Student" />
   
  </session-factory>
</hibernate-configuration>

 

В принципе тут все понятно. Отмечу только то, что такие поля, как имя драйвера, формат url, диалект берутся с официального сайта разработчиков базы данных. Логин и пароль указываются того пользователя, которого вы создали в вашей СУБД. Остальные поля — это некоторые дополнительные настройки, которые включают/выключают некоторые не особо важные опции.

 

Теперь создадим пакет util, а в нем класс HibernateUtil, который будет отвечать за обработку данного xml файла и установление соединения с нашей базой данных:

 

package util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory = null;
   
    static {
        try {
                //creates the session factory from hibernate.cfg.xml
                sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Exception e) {
              e.printStackTrace();
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

 

Теперь нам осталось разобраться со взаимодействием нашего приложения с базой данных. Тогда для класса-сущности, определим интерфейс StudentDAO из пакета DAO, содержащий набор необходимых методов:

 

package DAO;

import java.sql.SQLException;
import java.util.List;

import logic.Student;

public interface StudentDAO {
    public void addStudent(Student student) throws SQLException;   //добавить студента
    public void updateStudent(Student student) throws SQLException;//обновить студента
    public Student getStudentById(Long id) throws SQLException;    //получить стедента по id
    public List getAllStudents() throws SQLException;              //получить всех студентов
    public void deleteStudent(Student student) throws SQLException;//удалить студента
}

 

Теперь определим реализацию этого интерфейса в классе SudentDAOImpl в пакете DAO.Impl:

 

package DAO.Impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import util.HibernateUtil;
import DAO.StudentDAO;
import logic.Student;

public class StudentDAOImpl implements StudentDAO {
   
    public void addStudent(Student stud) throws SQLException {
            Session session = null;
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                session.beginTransaction();
                session.save(stud);
                session.getTransaction().commit();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION);
            } finally {
                if (session != null && session.isOpen()) {
                    session.close();
                }
            }
      }

      public void updateStudent(Student stud) throws SQLException {
            Session session = null;
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                session.beginTransaction();
                session.update(stud);
                session.getTransaction().commit();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION);
            } finally {
                if (session != null && session.isOpen()) {
                    session.close();
                }
            }
      }

      public Student getStudentById(Long id) throws SQLException {
            Session session = null;
            Student stud = null;
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                stud = (Student) session.load(Student.class, id);
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION);
            } finally {
                if (session != null && session.isOpen()) {
                    session.close();
                }
            }
            return stud;
      }

      public List<Student> getAllStudents() throws SQLException {
            Session session = null;
            List<Student> studs = new ArrayList<Student>();
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                studs = session.createCriteria(Student.class).list();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION);
            } finally {
                if (session != null && session.isOpen()) {
                    session.close();
                }
            }
            return studs;
      }

      public void deleteStudent(Student stud) throws SQLException {
            Session session = null;
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                session.beginTransaction();
                session.delete(stud);
                session.getTransaction().commit();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION);
            } finally {
                if (session != null && session.isOpen()) {
                    session.close();
                }
            }
      }  
}

 

В принципе, интуитивно тут все понятно. Давайте создадим класс Factory в пакете DAO, к которому будем обращаться за нашими реализациями DAO, от которых и будем вызывать необходимые нам методы:

 

package DAO;

import DAO.Impl.StudentDAOImpl;

public class Factory {
     
      private static StudentDAO studentDAO = null;
      private static Factory instance = null;

      public static synchronized Factory getInstance(){
            if (instance == null){
              instance = new Factory();
            }
            return instance;
      }

      public StudentDAO getStudentDAO(){
            if (studentDAO == null){
              studentDAO = new StudentDAOImpl();
            }
            return studentDAO;
      }  
}

 

Ну вот и все! Осталось только посмотреть как это работает:

 

package main;

import java.sql.SQLException;
import java.util.List;

import logic.Student;

import DAO.Factory;

public class Main {
   
    public static void main(String[] args) throws SQLException {
        //Создадим двух студентов
        Student s1 = new Student();
        Student s2 = new Student();
       
        //Проинициализируем их
        s1.setName("Ivanov Ivan");
        s1.setAge(21l);
        s2.setName("Petrova Alisa");
        s2.setAge(24l);
               
        //Сохраним их в бд, id будут сгенерированы автоматически
        Factory.getInstance().getStudentDAO().addStudent(s1);
        Factory.getInstance().getStudentDAO().addStudent(s2);      
       
        //Выведем всех студентов из бд
        List<Student> studs = Factory.getInstance().getStudentDAO().getAllStudents();
        System.out.println("========Все студенты=========");
        for(int i = 0; i < studs.size(); ++i) {
                System.out.println("Имя студента : " + studs.get(i).getName() + ", Возраст : " + studs.get(i).getAge() +",  id : " + studs.get(i).getId());
                System.out.println("=============================");             
        }      
    }
}

 

Скачать исходники проекта: HibernateSimpleExample.zip

javaxblog.ru/article/java-hibernate-1/

Вверх