Использование Hibernate Java Persistence Part 1 Для студентов старших курсов университетов Ст.преподаватель Дудник О.А.
Hibernate библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping ORM). Она представляет собой свободное программное обеспечение с открытым исходным кодом (open source), распространяемое на условиях GNU Lesser General Public License. Java ORMсвободное программное обеспечение открытым исходным кодом (open source)GNU Lesser General Public LicenseJava ORMсвободное программное обеспечение открытым исходным кодом (open source)GNU Lesser General Public License
Step 1: Download the Hibernate 4.3. x : First of all you have to download the Hibernate 4.3. x latest release. Step 2: Create database and table - Next you have to create database and tables Step 3: Add libraries: You should create project and add the Hibernate libraries files. You will also have to add the dataBases JDK driver jar file. Step 4: Create model class Step 5: Create hibernate.cfg file - Create the configuration file of Hibernate framework Step 6: Create the utility class for getting SessionFactory Step 7: Write the code for testing the Hibernate example - finally test the application.
STEP 1-3 Download the Hibernate 4.3. x : First of all you have to download the Hibernate 4.3. x latest release Create database and table - Next you have to create database and tables
Давайте напишем небольшое приложение, использующее библиотеку Hibernate для хранения и обработки таблицы СУБД Oracle. Для начала нам нужно скачать Hibernate. скачать Также нам понадобиться скачать и установить СУБД Oracle. terprise-edition/downloads/index html terprise-edition/downloads/index html
)
)
Для просмотра базы данных нужно установить SQL-developer loper-tools/sql- developer/downloads/index.html loper-tools/sql- developer/downloads/index.html, который работает только с JDK 1.6(нужно установить)
STEP 4 Create model class Опишем наш класс-сущность(entity), который будем хранить в БД(в пакете logic):
import public class Student { private Long id; private String name; private Long age; public Student(){ name = null; } public Student(Student s){ name = ment", strategy = public Long getId() { return id; public String getName(){ return name; 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 знал, что данный класс является сущностью, то есть объекты данного класса мы будем хранить в базе данных. Использованные здесь аннотации имеют следующий указывает на то, что данный класс является задает имя таблицы, в которой будут храниться объекты обозначает поле указывает на то, как будет генерироваться id (у нас по обозначает имя колонки, соответствующей данному полю.
Step 5 Create hibernate.cfg file - Create the configuration file of Hibernate framework Теперь создадим главный конфигурационный файл hibernate.cfg.xml и помести его в папку bin нашего проекта. Из этого файла Hibernate будет брать всю необходимую ему информацию
oracle.jdbc.driver.OracleDriver oracle.jdbc.driver.OracleDriver Your_Login Your_Login Your_Password Your_Password org.hibernate.dialect.OracleDialect true org.hibernate.dialect.OracleDialect true update false false thread "current_session_context_class">thread
Параметр " hibernate.hbm2ddl.auto " устанавливаем в значение true для того, чтобы объекты базы данных создавались автоматически на основе маппинга в java-hibernate проекте. Параметр " hibernate.hbm2ddl.auto " устанавливаем в значение true для того, чтобы объекты базы данных создавались автоматически на основе маппинга в java-hibernate проекте.
Step 6: Create the utility class for getting SessionFactory Теперь создадим пакет util, а в нем класс HibernateUtil, который будет отвечать за обработку данного xml файла и установление соединения с нашей базой данных: package util;
import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory = null; static { try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Step 7: Write the code for testing the Hibernate example The Data Access Object (DAO) pattern Для класса-сущности, определим интерфейс 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().openSe ssion(); session.beginTransaction(); session.save(stud); session.getTransaction().com mit(); } catch (Exception e) { JOptionPane.showMessageDial og(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().openSe ssion(); session.beginTransaction(); session.update(stud); session.getTransaction().com mit(); } catch (Exception e) { JOptionPane.showMessageDial og(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().openSe ssion(); stud = (Student) session.load(Student.class, id); } catch (Exception e) { JOptionPane.showMessageDial og(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION); } finally { if (session != null && session.isOpen()) { session.close(); } } return stud; } public List getAllStudents() throws SQLException { Session session = null; List studs = new ArrayList (); try { session = HibernateUtil.getSessionFactory().openSe ssion(); studs = session.createCriteria(Student.class).list() ; } catch (Exception e) { JOptionPane.showMessageDial og(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().openSe ssion(); session.beginTransaction(); session.load(stud, id); session.delete(stud); session.getTransaction().com mit(); } catch (Exception e) { JOptionPane.showMessageDial og(null, e.getMessage(), "Ошибка I/O", JOptionPane.OK_OPTION); } finally { if (session != null && session.isOpen()) { session.close(); } } } } session.getTransaction().com mit(); } catch (Exception e) { JOptionPane.showMessageDial og(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().add Student(s1); Factory.getInstance().getStudentDAO().add Student(s2); //Выведем всех студентов из бд List studs = Factory.getInstance().getStudentDAO().getAllStu dents(); System.out.println("========Все студенты========="); for(int i = 0; i studs = Factory.getInstance().getStudentDAO().getAllStu dents(); 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("=========== =================="); } } }
Теперь мы посмотрим как связать между собой несколько таблиц. Теперь база данных будет иметь такой вид:
//Test package logic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinTable; import javax.persistence.Table; import javax.persistence.JoinColumn; import public class Test { private Long tid; private String tname; private Statistics stat; public Test(){ tname = null; } public Test(Test s){ tname = = "id") public Statistics getStat(){ return strategy = public Long getTid() { return tid; public String getTName(){ return tname; } public void setId(Long i){ tid = i; } public void setTName(String s){ tname = s; strategy = public Long getTid() { return tid; public String getTName(){ return tname; } public void setId(Long i){ tid = i; } public void setTName(String s){ tname = s; } }
//Statistics package logic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; public class Statistics { private Long stid; private Long id; private Long tid; private Set studs = new HashSet (0); private Set tests = new HashSet (0); public = "id") public Set getTests() { return tests; } package logic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; public class Statistics { private Long stid; private Long id; private Long tid; private Set studs = new HashSet (0); private Set tests = new HashSet (0); public = "id") public Set getTests() { return @GenericGenerator(name="increment", strategy = public Long getStid(){ return stid; public Long getId(){ return id; public Long getTid(){ return @GenericGenerator(name="increment", strategy = public Long getStid(){ return stid; public Long getId(){ return id; public Long getTid(){ return = "id") public Set getStuds() { return studs; } }
Осталось только показать Hibernate, как эти таблицы между собой связаны. Как это делается? Опять же с помощью аннотаций. В Hibernate для этого предусмотрены следующие Например, чтобы связать таблицы Student и Statistics связью многие к одному, следует добавить в класс Student следующей код:
private = "id") public Statistics getStat(){ return stat; }
Итак, общая схема того, что нужно знать о Hibernate изображена ниже.
Успехов!