Ниже будет приведено несколько вариантов конфигурирования Hibernate. Конфигурация или отображение (mapping) обычно осуществляется один раз
в течение работы приложения. Конкретная конфигурация содержится в объекте класса net.sf.hibernate.cfg.Configuration.
private Configuration createConfiguration()
throws ClassNotFoundException, MappingException {
Configuration configuration =
new Configuration().addClass(Class.forName("courses.hiber.Course"))
.addClass(Class.forName("courses.hiber.Student"));
return configuration;
}
Этот метод создает новую конфигурацию и добавляет в нее классы courses.hiber.Course и courses.hiber.Student (данное добавление необходимо только в том случае, если mapping-файлы не были указаны в конфигурационном файле Hibernate). Hibernate ищет mapping по принципу, указанному выше. В конфигурацию могли быть также добавлены другие источники mapping, например поток, jar-файл, org.dom4j.Document. Метод addClass() возвращает объект Configuration, поэтому он вызывается несколько раз подряд. Далее добавляется в приложение метод, генерирующий по конфигурации таблицы в базе данных.
Hibernate содержит консольное приложение для генерации скриптов. В приведенном ниже коде объект класса SchemaExport генерирует таблицы базы данных по настроенному mapping и заданным свойствам, записывает текст
в файл (c:/temp/courses_script.sql) и выполняет сгенерированный SQL-код.
private void generateAndExecuteCreationScript(Configuration configuration, Properties properties) throws HibernateException {
SchemaExport export = new SchemaExport(configuration, properties);
export.setOutputFile("c:\\temp\\courses_script.sql").create(true, true);
}
В методе create(true, true) генерируется script-текст для создания таблиц и посылается на консоль (определяется первым параметром – true), и на его основе создаются таблицы в базе данных (второй параметр – true).
Session – это интерфейс, используемый для сохранения в базу данных и восстановления из нее объектов классов Course и Student. SessionFactory – потокобезопасный, неизменяемый кэш откомпилированных mapping для одной базы данных, фабрика для создания объектов Session.
1. Создается объект SessionFactory
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Метод configure() класса Configuration заносит информацию
в объект Configuration из конфигурационного файла Hibernate;
2. Создается сессия
Session session = factory.openSession();
3. Извлекаются все строки из таблиц course и student. Текст запросов
и команд пишется на Hibernate-диалекте. Он похож на SQL, только в качестве сущностей-носителей данных выступают классы, а не таблицы.
List courses = session.find("from Course");
List students = session.find("from Student");
4. В конце обращения сессия закрывается.
session.close();
Интерфейс net.sf.hibernate.SessionFactory содержит ряд необходимых методов:
openSession() – создает соединение с базой данных и открывает сессию. В качестве параметра может быть передано и соединение, тогда будет создана сессия по существующему соединению;
close() – уничтожение SessionFactory и освобождение всех ресурсов, используемых объектом.
Интерфейс net.sf.hibernate.Session – однопоточный, короткоживущий объект, являющийся посредником между приложением и хранилищем долгоживущих объектов, используется для навигации по объектному графу или для поиска объектов по идентификатору. По сути, является классом-оболочкой вокруг JDBC-соединения. В то же время представляет собой фабрику для объектов Transaction.
load(Class theClass, Serializable id) – возвращает объект данного класса с указанным идентификатором;
load(Object object, Serializable id) – загружает постоянное состояние объекта с указанным идентификатором в объект, указатель которого был передан;
save(Object object [, Serializable id]) – сохраняет переданный объект. Если передан идентификатор, то использует его;
update(Object object [, Serializable id]) – обновляет постоянный объект по идентификатору объекта, а если передан идентификатор, то обновляет объект с указанным идентификатором;
saveOrUpdate(Object object) – в зависимости от значения идентификатора сохраняет или обновляет объект;
get(Class class, Serializable id) – возвращает объект данного класса, с указанным идентификатором или null, если такого объекта нет;
delete(Object object) – удаляет объект из базы данных;
delete(String query) – удаляет все объекты, полученные по запросу. Возможен и вызов запроса с параметрами delete(String query,
Object[] objects, Type[] types);
Transaction beginTransaction() – начинает единицу работы
и возвращает ассоциированную транзакцию.
Для осуществления запросов используется экземпляр интерфейса org.hibernate.Query. Получить его можно с помощью объекта Session: