1. жизненный цикл постоянного объекта
После того, как приложение использует структуру Hibernate, постоянные объекты, созданные приложением, пройдут полный набор жизненных циклов для завершения операций базы данных, среди которых три основных состояния являются переходными, постоянными и отделенными. Переходы этих трех состояний можно контролировать в приложении, как показано на рисунке ниже:
Чтобы четко понять эти состояния, вот пример, чтобы просмотреть различия между объектами в этих состояниях. Следующие коды в штатах следующие:
(1) Создать сборку Hibernate_session и добавить соответствующий пакет JAR;
(2) настроить Hibernate, добавить соответствующий класс пользователя объекта и его отображение файлов и настроить соответствующее соединение базы данных;
Файл файла класса пользователя user user.hbm.xml код:
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-сгенерировано 2014-4-30 15:39:3333333333.0.0. <Hibernate Mapping> <class name = "com.hibernate.user"> <id name = "id"> <generator/> </id> <name = "name"/> <name = "password"/> <name = "createtime"/> <name = "expireTime"/> </> </hibernate-mapping>
Код конфигурации подключения к базе данных Hibernate:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype hibernate-configuration public "-// конфигурация Hibernate/Hibernate DTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtdd"> <hibrence-configuration> <hibrence-configuration> <hibrernate-configuration-3.0.dtdd "> <hibrence-configuration-3.0.dtd" <name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc: mysql: // localhost: 3306/hibernate_session </property> <property name = "hibernate.conection.ascorname. name = "hibernate.connection.password"> ab12 </property> <!-диалект: диалект, инкапсулированный базовый API, аналогичный времени выполнения, преобразует базу данных в соответствующий язык в конфигурации-> <свойство name = "hibernate.dialect"> resource = "com/hibernate/user.hbm.xml"/> </session-factory> </hibernate-configuration>
(3) добавить открытый класс статического сеанса члена, чтобы создать SessionFactory и его объект сеанса;
пакет com.hibernate; Импорт org.hibernate.session; Импорт org.hibernate.sessionFactory; Импорт org.hibernate.cfg.configuration; открытый класс сессия {частная статическая сеансфакторная фабрика; // объявить статическую локальную переменную сеанс Фактор, зеркало базы данных static {try {// Создать и получить файл конфигурации для базы данных конфигурации и получить конфигурацию hibernate.cfg.xml cfg = new configuration (). Configure (); factory = cfg.buildSessionFactory (); // Создание изображения базы данных} catch (Exception e) {e.printstackTrace (); // Печать сообщения об ошибке}} public static session getsession () {return factory.opensession (); // Возврат созданный объект сеанса} public Static SessionFactory getSessionFactory () {return Factory; // Возврат соответствующий сеансфактор} // Закрыть объект сеанса public void void закрыть (сеанс сеанса) {if (session! = Null) {if (session.isopen ()) {session.close (); }}}}}(4) Добавьте исходную папку и добавьте пакет с именем Com.hibernate в папку и добавьте в пакет файл класса с именем SessionTest.
пакет com.hibernate; импортировать java.util.date; Импорт junit.framework.testcase; Импорт org.hibernate.session; Импорт org.hibernate.transaction; открытый класс SessionTest Extends TestCase {} 2. Метод преобразования состояния
1. Объект непосредственно входит в постоянное состояние
1.1 Получить метод
Получите ряд информации из базы данных и синхронизируйте информацию в созданный объект. Этот метод возвращает объект объекта и возвращает NULL, если контент не найдено. В следующем примере используется метод получения сеанса для получения объекта и преобразования объекта в экземпляр.
public void testget1 () {Session Session = null; Транзакция tx = null; try {session = hibernateutils.getSession (); // Открыть транзакцию tx = session.beginTransaction (); // Объект, загруженный GET - это постоянный объект // execute get для немедленно выпустить оператор запроса, и если он не существует, он вернет null user user = (user) session.get (user.class, «ff80808145bc28cc0145bc28ce020002»); System.out.println (user.getName ()); // Постоянное состояние // объект с постоянным изменением состояния, когда свойства объекта изменятся // hibernate синхронизируют user.setName ("Zhao Liu"); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); if (tx! = null) {tx.rollback (); }} наконец {hibernateutils.closesession (session); }} Установите точки останова, чтобы получить пользовательский объект.
Этот объект получен, и пользовательский объект получается после кастинга. Метод SETNAME добавляется в программу, что означает, что имя в базе данных будет обновлено. После завершения выполнения база данных будет проверена, как показано на рисунке ниже, чтобы обновить результаты.
1.2 Метод загрузки
Функция аналогична методу GET, и она также получает данные из базы данных и синхронизирует их в объект. Этот метод поддерживает ленивую операцию. Он возвращает постоянный объект объекта или прокси, поэтому его необходимо преобразовать.
public void testload1 () {Session Session = null; try {session = hibernateutils.getSession (); // Оператор запроса не будет немедленно проверен, потому что нагрузка поддерживает ленивый (задержка нагрузки/ленивая нагрузка) // ЧТО ТАКОЕ УЧИТЬ ЛЕНз? Только когда этот объект действительно используется, а затем создан, будет выпущена заявление запроса для Hibernate. В основном это повышение производительности. Lazy - очень важная особенность в Hibernate. Как реализуется Lazy of Hibernate? Реализовано прокси -объектами. Прокси -объекты в основном используют // сгенерированные библиотекой CGLIB вместо динамического прокси JDK, поскольку динамический прокси JDK может генерировать только прокси для классов, которые реализуют оправдания. Cglib может генерировать // прокси для занятий. Он использует метод наследования пользователя user = (user) session.load (user.class, "8A1B653745BCC7B50145BCC7B7B7140001"); System.out.println (user.getName ()); // Постоянное состояние // объекты с постоянным состоянием, когда свойства объекта изменятся // hibernate синхронизируют user.setname ("zhaoliu"); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); } наконец {hibernateutils.closesession (Session); }} Запрос, чтобы получить пользовательский объект, как показано на рисунке ниже:
Анализируя приведенный выше рисунок, полученный пользовательский объект не завершен, или нет общего пользовательского объекта, но это прокси. Он использует Cglib для предварительной загрузки объекта и действительно создается только при использовании объекта.
1.3 Получить VS нагрузку
Методы получения и загрузки очень важны. Их часто берут во время интервью с Hibernate. Ниже приведено сравнение следующих двух.
Сходство:
(1) функции одинаковы, и данные о отношениях преобразуются в объекты;
(2) Метод использования одинаково, и два различия в параметрах также требуются:
(1) Метод загрузки поддерживает ленивую работу, предварительно загружает объект и создается только при использовании. Получить непосредственно преобразовать реляционные данные в объекты;
(2) Если объект загрузки нагрузки не существует, будет брошена объекта NotFoundException, и если GET не получит данные, он вернет NULL.
2. Вручную построить отдельные объекты
Есть еще один метод получения объекта. Это отличается от методов получения и загрузки. Это ручный метод. Во -первых, распространен объект, а затем данные объекта получают путем формулирования идентификатора. Метод заключается в следующем:
public void testuer () {session session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); // вручную построить отдельный объект -объект user = new user (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // Постоянное состояние // объект с постоянным состоянием, когда свойства объекта изменятся // hibernate синхронизируют session.getTransaction (). Commit () с базой данных при очистке кэша (проверка грязных данных); } catch (Exception e) {e.printstackTrace (); } наконец {hibernateutils.closesession (Session); }} Посмотреть полученную диаграмму результатов:
Диаграмма результатов анализа используется в коде для установки идентификационный номер для объекта. После того, как идентификационный номер сформулирован, объект может работать. После того, как транзакция будет представлена, она синхронизируется с базой данных, и для вручную используется спецификация ручной работы для вручную.
2.1 Удалить метод
Чтобы удалить объект, указанный в базе данных, объект должен быть преобразован в постоянное состояние перед тем, как его удалить. Вы можете использовать методы GET, загрузку или ручную, чтобы указать объект. Метод заключается в следующем:
session = hibernateutils.getsession (); session.beginTransaction (); Пользователь пользователь = (пользователь) session.load (user.class, "8A1B653745BCC6D50145BCCC6D67A0001"); // Рекомендуется использовать этот метод для удаления, сначала загрузить, а затем удалить session.delete (user);
2.2 Обновление
Обновите данные, этот метод будет изменять данные в базе данных. При использовании его будет ситуация в количестве, которая обновит значение определенного поля в базе данных или обновить всю строку базы данных.
2.2.1 Обновить значение поля
Если вы хотите обновить значение определенного поля, перед обновлением вам необходимо использовать загрузку или конвертировать объект в постоянный код состояния следующим образом:
// получить сеанс сеанса сеанса = hibernateutils.getsession (); // Открыть сеанс транзакции.beginTransaction (); // или вы можете использовать другой метод для включения //Session.getTransaction (). Begin (); // загружать, чтобы получить пользовательский объект // Метод 1: Использовать метод загрузки // user user = (user) session.load (user.class, "8A1B653745BCC7B50145BCC7B7B7140001"); // Метод 2: вручную получить пользователь пользователя = new user (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // Обновление имени user.setName ("Zhangsan"); session.update (пользователь); session.getTransaction (). Commit ();2.2.2 Обновите всю строку <br /> Если вы хотите обновить данные всей строки, вы можете вручную преобразовать состояние в отдельное состояние и вручную указать значение идентификатора объекта. Код заключается в следующем:
// получить сеанс сеанса сеанса = hibernateutils.getsession (); // Открыть сеанс транзакции.beginTransaction (); // или может использовать другой метод для включения //session.getTransaction (). Begin (); // вручную получить пользователь пользователя = new user (); user.setid ("8A1B653745BCC7B50145BCC7B7B7140001"); // Обновление имени user.setName ("Zhangsan"); session.update (пользователь); session.getTransaction (). Commit (); Просмотреть результаты обновления:
Анализируя результаты обновления, он фактически обновляет всю строку данных базы данных. В этой операции обновления слишком много неопределенности и не рекомендуется использовать его.
2.3 Метод сохранения
Вставить данные. При выполнении метода сохранения оператор INSERT базы данных вызывается, чтобы добавить новую строку в базу данных. Сохраненный объект будет преобразован в постоянное состояние. В этом состоянии объект может снова обновить объект и будет обновляться в базе данных с изменениями, когда транзакция окончательно представлена. следующее:
public void testSave2 () {session session = null; Транзакция tx = null; try {session = hibernateutils.getSession (); // Открыть транзакцию tx = session.beginTransaction (); // Пользователь пользователя Transient User = new user (); user.setName ("Zhangsi"); user.setpassword ("123"); user.setCreatetime (new Date ()); user.setExpireTime (new Date ()); // Постоянное состояние // объект с постоянным состоянием изменяется при изменении свойств объекта // hibernate синхронизирует session.save (пользователь); user.setname ("lisi"); tx.commit (); } catch (Exception e) {e.printstackTrace (); if (tx! = null) {tx.rollback (); }} наконец {hibernateutils.closesession (session); } // Отдельный статус} Просмотреть предыдущий пример просмотр результата:
Результат анализа: сеанс фактически выполняет две операции при отправке транзакции. В сочетании с процессом обновления в коде, во -первых, добавлен новый пользовательский объект, а затем выполняется операция сохранения. Он вызовет оператор INSERT, затем в коде выполняется операция SETNAME, а имя повторно модифицируется. Тем не менее, в настоящее время он не был синхронизирован с базой данных, но находится в памяти. В настоящее время будет два состояния. Мы говорим, что биты данных в это время являются грязными данными, и, наконец, обновляются в базу данных при отправке транзакции.