Выскажи свое мнение
Категории раздела
Статьи с других форумов [25]
Наш опрос
Пользуетесь ли Вы Твиттером?
Всего ответов: 27
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Чужие статьи » Статьи с других форумов

Основы Hibernate Часть №2


Теперь определим реализацию этого интерфейса в классе BusDAOImpl
package DAO.Impl;
import DAO.BusDAO;
import logic.Bus;
import logic.Driver;
import logic.Route;
import java.sql.SQLException;
import java.util.Collection;
import java.util.ArrayList;
import java.util.List;
import util.HibernateUtil;
import javax.swing.*;
import org.hibernate.Session;
import org.hibernate.Query;

public class BusDAOImpl implements BusDAO {

  public void addBus(Bus bus) throws SQLException {
    Session session = null;
    try {
      session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      session.save(bus);
      session.getTransaction().commit();
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка при вставке", JOptionPane.OK_OPTION);
    } finally {
      if (session != null && session.isOpen()) {

        session.close();
      }
    }
  }
  public void updateBus(Long bus_id, Bus bus) throws SQLException {
    Session session = null;
    try {
      session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      session.update(bus);
      session.getTransaction().commit();
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка при вставке", JOptionPane.OK_OPTION);
    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
  }
  public Bus getBusById(Long bus_id) throws SQLException {
    Session session = null;
    Bus bus = null;
    try {
      session = HibernateUtil.getSessionFactory().openSession();
      bus = (Bus) session.load(Bus.class, bus_id);
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка 'findById'", JOptionPane.OK_OPTION);
    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
    return bus;
  }
  public Collection getAllBusses() throws SQLException {
    Session session = null;
    List busses = new ArrayList<Bus>();
    try {
      session = HibernateUtil.getSessionFactory().openSession();
      busses = session.createCriteria(Bus.class).list();
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка 'getAll'", JOptionPane.OK_OPTION);
    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
    return busses;
  }
  public void deleteBus(Bus bus) throws SQLException {
    Session session = null;
    try {
      session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      session.delete(bus);
      session.getTransaction().commit();
    } catch (Exception e) {
      JOptionPane.showMessageDialog(null, e.getMessage(), "Ошибка при удалении", JOptionPane.OK_OPTION);
    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
  }
  public Collection getBussesByDriver(Driver driver) throws SQLException {
    Session session = null;
    List busses = new ArrayList<Bus>();
    try {
      session = HibernateUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Long driver_id = driver.getId();
      Query query = session.createQuery(
          " select b "
              + " from Bus b INNER JOIN b.drivers driver"
              + " where driver.id = :driverId "
      )
          .setLong("driverId", driver_id);
      busses = (List<Bus>) query.list();
      session.getTransaction().commit();

    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
    return busses;
  }
  public Collection getBussesByRoute(Route route){
    Session session = null;
    List busses = new ArrayList<Bus>();
    try {
      session = HibernateUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Long route_id = route.getId();
      Query query = session.createQuery("from Bus where route_id = :routeId ").setLong("routeId", route_id);
      busses = (List<Bus>) query.list();
      session.getTransaction().commit();

    } finally {
      if (session != null && session.isOpen()) {
        session.close();
      }
    }
    return busses;
  }

}


* This source code was highlighted with Source Code Highlighter.
Еще рас скажу, что реализации DriverDAOImpl и RouteDAOImpl будут аналогичны этой.
Наибольший интерес для нас представляют два последних метода, взгляните на них повнимательнее. Как происходит общение с базой? От объекта SessionFactory создается новая или получается текущая сессия, зачем начинается транзакция, выполняются необходимые действия, коммит транзакции и закрытие сессии. Вроде ничего сложного :) Обратите внимание, на то, каким синтаксисом описан запрос к базе. Это так называемый HQL (Hibernate Query Language) HQL представляет собой объектно-ориентированный язык запросов, возможности его широки, но мной настолько широко еще не осилены :) Помимо save, load, update, delete и HQL, можно пользоваться и обычным SQL. Например:

String query = "SELECT driver_id, name, surname, age FROM drivers";
List<Driver> drivers = new ArrayList<Driver>();
drivers = (List<Driver>) session.createSQLQuery(query).list();

Теперь создадим класс фабрики, к которой будем обращаться за нашими реализациями DAO, от которых и будем вызывать необходимые нам методы.
public class Factory {
  
  private static BusDAO busDAO = null;
  private static DriverDAO driverDAO = null;
  private static RouteDAO routeDAO = null;
  private static Factory instance = null;

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

  public BusDAO getBusDAO(){
    if (busDAO == null){
      busDAO = new BusDAOImpl();
    }
    return busDAO;
  }

  public DriverDAO getDriverDAO(){
    if (driverDAO == null){
      driverDAO = new DriverDAOImpl();
    }
    return driverDAO;
  }

   public RouteDAO getRouteDAO(){
    if (routeDAO == null){
      routeDAO = new RouteDAOImpl();
    }
    return routeDAO;
  }
}


* This source code was highlighted with Source Code Highlighter.
Теперь нам осталось создать какой-либо демонстрационный класс, для того, чтобы посмотреть и опробовать все то, что мы написали.
public class Main {
  public static void main(String[] args) throws SQLException {
    
    Collection routes = Factory.getInstance().getRouteDAO().getAllRoutes();
    Iterator iterator = routes.iterator();
    System.out.println("========Все маршруты=========");
    while (iterator.hasNext()) {
      Route route = (Route) iterator.next();
      System.out.println("Маршрут : " + route.getName() + "  Номер маршрута : " + route.getNumber());
      Collection busses = Factory.getInstance().getBusDAO().getBussesByRoute(route);
      Iterator iterator2 = busses.iterator();
      while (iterator2.hasNext()) {
        Bus bus = (Bus) iterator2.next();
        System.out.println("Автобус № " + bus.getNumber());

      }
    }
    Collection busses = Factory.getInstance().getBusDAO().getAllBusses();
    iterator = busses.iterator();
    System.out.println("========Все автобусы=========");
    while (iterator.hasNext()) {
      Bus bus = (Bus) iterator.next();
      Collection drivers = Factory.getInstance().getDriverDAO().getDriversByBus(bus);
      Iterator iterator2 = drivers.iterator();
      System.out.println("Автобус № " + bus.getNumber());
      while (iterator2.hasNext()) {
        Driver driver = (Driver) iterator2.next();
        System.out.println("Имя : " + driver.getName() + "   Фамилия: " + driver.getSurname());

      }
    }

  }
}


* This source code was highlighted with Source Code Highlighter.
Еще раз скажу, что может не самый удачный вариант использования всего нами написанного, но для этого уже лучше GUI писать или Web-интерфейс, а это уже другая песня :)


P.S.. Скажу, что на 100%-ую правильность я не претендую, это мое личное имхо, однако очень надеюсь, что это станет для кого-то полезным материалом.

P.S.S. Все библиотеки и файлы качать тут.

Статья beg'a habrahabr.ru
Категория: Статьи с других форумов | Добавил: MN (22.07.2008) | Автор: beg W
Просмотров: 820 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2025Конструктор сайтовuCoz