Первоначальный файл базы данных, необходимый в этой статье, для загрузки и обучения предоставлен полный пример кода для общих операций Hibernate (включая все необходимые файлы JAR для операций Hibernate): http://download.csdn.net/detail/daijin8888888/9551724
1. Картографирование ассоциации Hibernate
1) Что такое картирование ассоциации?
Если между таблицами существует связь, Hibernate позволяет нам описать их ассоциацию в HBM.XML, а затем автоматически работать на другой таблице отношений в соответствии с этими отношениями, когда мы работаем с одной из таблиц. Затем настройки этой ассоциации называются картированием ассоциации.
2) Каковы преимущества картирования ассоциации?
Несколько таблиц могут быть связаны с одним посещением
-Посредством данных таблицы взаимоотношений ассоциатив
-Ассоциация новых и модифицированных данных таблиц взаимоотношений
-Ассоциированные данные удаления из таблицы отношений
3) Шаги внедрения составления ассоциации
- Понять взаимосвязь между таблицами и проясните поля отношений
-Применить атрибут ассоциации в класс сущности, чтобы инкапсулировать связанные данные
-Вы должны настроить файл HBM.XML и установить отношения ассоциации
*2. Одно ко многим ассоциация
Пример: если учетная запись имеет несколько записей службы, можно надеяться, что при запросе данных учетной записи она автоматически запросит соответствующие данные службы.
1) Сторонние отношения
Отношения с одним ко многим, область отношений-это Service.account_id. (То есть должен быть полевой account_id, связанный с таблицей учетных записей в таблице службы, и это поле соответствует идентификатору в таблице учетных записей)
2) Добавить атрибуты отношений
В классе учетной записи добавьте соответствующие службы атрибутов, которые являются типом Set <service>.
частный набор <service> services = new Hashset <service> ();
3) Установите отношения
-граммама
Установите отношения с одним ко многим в account.hbm.xml
<set name = "Имя атрибута ассоциации"> <ключ Column = "Имя поля ассоциации"/> <One-To-Many/> </set>-Implement <set name = "services"> <ключ Column = "Account_id"/> <One-Many/> </set>
4) Пример кода
Известно:
-Ассоциированные службы атрибутов
-Ассоциированная полевая учетная запись_ид
-Ассоциация объекта службы-> Служба названия таблицы
<span style = "font-size: 14px;"> public void testfind () {session = hibernateutil.getSession (); Учетная запись a = (учетная запись) session.load (account.class, 1010); System.out.println ("--- Показать информацию об учетной записи ----"); System.out.println (a.getid () + "" + a.getRealName () + "" + a.getIdcardno ()); System.out.println ("-Показать бизнес-учетную запись в соответствии с текущей учетной записью ----"); Set <service> services = a.getServices (); для (Service S: Services) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } System.out.println (a.toString ()); } </span>*3. Ассоциация многих к одному
Пример: я надеюсь, что после запроса данных об обслуживании я могу автоматически запросить соответствующие данные учетной записи.
1) Отношения
Услуга и учетная запись имеют отношения к одному, а поле отношений-это service.account_id
2) Добавить связанные атрибуты
-Применить учетную запись соответствующей собственности в классе объекта Service, его тип-учетная запись.
частная учетная запись;
После этого атрибут AccountId может быть удален, а значение account_id можно получить с помощью метода getAccount (). GetId ()
3) Установите отношения
а Синтаксис:
-in service.hbm.xml, добавьте конфигурацию отношений ассоциации
-<много-один name = "Ассоциация Имя атрибута"
Column = "Имя поля реляционного поля"
/>
беременный Выполнение:
<много-один name = "account"
Column = "Account_ID"
/>
4) Пример кода
Известно:
-Ассоциационная собственность
-Ассоциированная полевая учетная запись_ид
-ACCOUNT-> Аккаунт по имени таблицы, идентификатор первичного ключа
<span style = "font-size: 14px;"> public void testfind () {session = hibernateutil.getSession (); Сервис S = (Service) Session.get (Service.class, 2002); System.out.println ("---- Показать информацию о бизнес-учетной записи ----"); System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); System.out.println ("--- Показать информацию об учетной записи ---"); System.out.println (s.getAccount (). GetId () + "" + s.getAccount (). GetRealName ()); } </span>*4. Связанные операции
1) Связанный запрос
Если вам нужно использовать оператор SQL для создания текущего объекта и связанного атрибута, вы можете использовать следующий метод:
а (Не рекомендуется) изменить связанное отображение атрибутов в HBM.XML
ленивый атрибут:
Верно означает, что ленивая загрузка включена;
ложное означает закрытие ленивой загрузки
Атрибут по получению:
Соединение означает, что метод соединения используется для запроса с основным объектом. В настоящее время Lazy = "false" недействителен;
Выберите (по умолчанию) означает отправку данных, связанных с запросом SQL, отдельно
беременный (Рекомендуется) пройти HQL и присоединиться к синтаксису Fetch
-Из учетной записи присоединяется a.services, где a.id =?
Значение: при запросе объекта учетной записи, данные атрибутов, связанные с службами, можно найти вместе с использованием табличного соединения.
-Сервис S присоединиться к Fetch S.Account, где s.id =?
Значение: при запросе объектов службы связанные с учетной записью данные атрибута можно найти вместе с использованием табличного соединения.
-Сервис S присоединиться к Fetch S.Account, где s.account.id =?
Уведомление:
- Объекты и свойства написаны в HQL
-Join Fetch не имеет пункта после этого, а Fetch связан атрибут
-Query.SetInteger для установки значения параметров целого числа, а индекс начинается с 0.
-Если ясно, что HQL вернет только одну запись, вы можете использовать метод Query.uniqueresult () для возврата уникальной записи
в Пример кода (переписывайте вышеупомянутый код запроса ассоциации «один ко многим»)
<span style = "font-size: 14px;"> public void testfind () {session = hibernateutil.getSession (); // учетная запись a = (account) session.load (account.class, 1010); String hql = "из учетной записи a соединение a.services, где a.id =?"; Query Query = session.createequery (hql); Query.SetInteger (0, 1010); //? Запуск с 0 учетной записи a = (account) Query.UniquerESult (); // однострочный запрос может использовать System.out.println ("--- Информация о расстоянии учетной записи ----"); System.out.println (a.getid () + "" + a.getRealName () + "" + a.getIdcardno ()); System.out.println ("--- Отображение бизнес-учетной записи в соответствии с текущей учетной записью ----"); Set <service> services = a.getServices (); для (Service S: Services) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } System.out.println (a.toString ()); } </span> 2) Каскадное добавление и каскадную модификацию
а Когда таблица имеет связь с ассоциацией, Hibernate не только обеспечивает функцию запроса ассоциации, но также имеет возможность добавлять, изменять и удалять данные в таблице ассоциации. Эта способность называется каскадной операцией.
беременный Как реализовать каскадные операции
Вам нужно добавить каскад атрибута в то место, где установлен связанный атрибут.
-Нет: каскада не поддерживается по умолчанию
-Save-update: поддерживает каскадное дополнение и обновление
-delete: поддерживает каскадную удаление
-Все: поддерживает каскадное добавление, обновление и удаление
в Описание
Обычно существует табличное отношение 1 к многим. Одна сторона 1 является основным столом, а другая сторона 1 - рабов. Часто необходимо добавлять, обновлять и удалять данные подчиненной таблицы при добавлении, обновлении и удалении основной таблицы. Например: при удалении учетной записи вы должны удалить данные бизнес -аккаунта вместе.
3) Каскадное удаление
а SET CASCADE = "DELETE" или CASCADE = "ALL" для поддержки удаления каскада
беременный Как правило, необходимо добавить атрибут uververse = "true" на установленном теге 1.
в Session.Delete (OBJ); OBJ должен быть постоянным объектом, не может быть новым, и должен быть загружен/получить получение.
дюймовый Методы удаления партии:
Cascading DEDETE использует операторы N+1 DELETE для очистки связанных данных основной таблицы и таблицы иностранных ключей.
Если это удаление партии , не рекомендуется каскадная делеция. Рекомендуется использовать HQL для записи операторов Delete Delete .
Удалить из службы, где account.id =? // Удалить все данные account.id =? В таблице обслуживания (это предложение заменяет n операторов удаления в операции каскада)
Удалить из учетной записи, где ID =?
4) обратные атрибуты (понимание) детали здесь
Способствовать ли контроль поддержания отношений. То есть по умолчанию отношения между учетной записью и объектами обслуживания поддерживаются обеими сторонами. Это означает, что при выполнении каскадных операций в учетной записи или объектах службы вам необходимо выполнить оператор обновления, чтобы установить связанное поле для того же идентификатора. Если вам необходимо отменить работу по обслуживанию отношений определенной стороны, вы можете добавить настройку uververse = "true" в раздел связанных атрибутов, который может избежать выполнения оператора обновления.
Верно: Рука над контролем, текущий объект не несет ответственности за поддержание отношений между двумя таблицами
Неверно: контроль не передается, текущий объект должен нести ответственность за поддержание отношений между двумя таблицами
Совет: часто устанавливается в обратном порядке = "true" для одной стороны (то есть, <One-many> картирующая часть) для uververse = "true", так что можно избежать большого количества операторов обновления обновлений при каскадных операциях на одной стороне.
*5. Ассоциация многих ко многим
Пример: admin admin_info и ролевая role_info имеют отношения много-ко-то. Я надеюсь, что при запросе администратора он может запросить свою соответствующую роль. При разработке базы данных необходимо использовать 3 таблицы для ее представления.
Admin_info (admin)
Admin_role (администратор и ролевые отношения)
Роль (роль)
1) Поля взаимоотношений
Поля взаимоотношений расположены в их промежуточной таблице admin_role,
admin_id = admin_info.id
role_id = role_info.id
2) Добавить связанные атрибуты Добавление связанных с ролевыми атрибутами к классу организации администратора
SET <Some> Роли
3) Добавить конфигурацию сопоставления ассоциации в admin.hbm.xml
--Syntax<set name="association attribute name" table="middle table name"> <key column="Admin's associated field name"/> <many-to-many column="Admin's associated field name"/> </set> --Code<set name="roles" table="admin_role"> <key column="admin_id"/> <many-to-many column="role_id"/> </set>
4) Каскадная операция
Каскад означает, что каскадные операции поддерживаются, а таблица работает с другой стороны, а не представляет промежуточную таблицу каскадных операций. Для поддержания промежуточных таблиц нет необходимости писать каскадный атрибут.
5) обратный
Вообще говоря, отношения между многими ко многим не должны писать uververse = "true". Причина в том, что когда другая сторона вставляет данные, она может не иметь данных в промежуточной таблице, а текущая сторона должна их поддерживать. Следовательно, обратный = "true" не может быть написана. В противном случае ни одна из сторон не поддерживает эти отношения, и есть проблемы с данными.
6) Пример кода Java
<span style = "font-size: 14px;"> // Удалить роль @test public void testdeleterole () {session session = hibernateutil.getsession (); Транзакция tx = session.beginTransaction (); try {admin a = (admin) session.load (admin.class, 1); Роль R1 = (Роль) Session.Load (ROLE.Class, 1); A.GetRoles (). Удалить (r1); session.update (a); tx.commit (); } catch (hibernateexception e) {e.printstacktrace (); tx.rollback (); } наконец {session.close (); }} // Приложение роли @test public void testaddrole () {session = hibernateutil.getsession (); Транзакция tx = session.beginTransaction (); try {admin a = (admin) session.load (admin.class, 1); Роль R1 = (Роль) Session.Load (ROLE.Class, 1); Роль R2 = (Роль) Session.Load (ROLE.Class, 43); Роль R3 = (роль) Session.Load (ROLE.Class, 44); A.GetRoles (). Add (R1); A.GetRoles (). Add (R2); A.GetRoles (). Add (R3); session.update (a); tx.commit (); } catch (hibernateexception e) {e.printstacktrace (); tx.rollback (); } наконец {session.close (); }} @Test public void testfind () {session = hibernateutil.getsession (); Транзакция tx = session.beginTransaction (); try {admin a = (admin) session.load (admin.class, 1); System.out.println ("----- Показать информацию администратора ----"); System.out.println (a.getid () + "" + a.getName () + "" + a.getTelephone ()); System.out.println ("---- Показать информацию о роли администратора ---"); Для (роль роли: a.getRoles ()) {System.out.println (role.getName () + ""); } tx.commit (); } catch (hibernateexception e) {e.printstacktrace (); tx.rollback (); } наконец {session.close (); }} </span>6. Ассоциация наследования
Пример: поиск продуктов на веб-сайтах электронной коммерции, таких как вход в iPhone для поиска. Результаты поиска могут включать информацию о продукте, связанную с мобильными телефонами, фильмами мобильных телефонов, чехлами для мобильных телефонов, зарядных устройств, наушников и т. Д. Эта функция может быть выражена специальными отношениями один к одному при разработке таблиц. То есть общие атрибуты всех продуктов извлекаются в общий табличный продукт. Только конкретная таблица продуктов хранится в конкретной таблице продуктов, поэтому конкретная таблица продуктов и таблица продуктов имеют отношение один к одному. При поиске вы можете найти только таблицу продукта, и вы можете не размывать поиск соответствующей информации.
-Генеральная информационная таблица продукт (идентификатор, имя, цена, DESC)
-книга списка продуктов (ID, Authod, Publishing, Words)
-Я надеюсь, что при работе с книжным столом я могу автоматически поддерживать общие поля в таблице продуктов.
1) четкие отношения
Книги и продукт имеют отношения один на один. Цель этого отношений - повторное использование полей в таблице продуктов, таких как отношения наследования.
2) Класс сущности
Книга расширяет продукт
3) Связанные отношения отражаются в файлах конфигурации
-Родительский тип согласуется с исходным методом написания файлов конфигурации
-Subtypes имеют особые характеристики
<nacked-subclass name = "name type" table = "name" extends = "name parent class"> <ключ Column = "Имя поля ассоциации"/> <name = "" type = "" column = "/> ... </uped-subclass>
4) В отношениях наследования, поскольку в двух таблицах есть отношение, аналогичное взаимосвязи родителя и ребенка, на данные в родительской таблице следует ссылаться в детской таблице. Не существует случая не ссылки, то есть родительская таблица должна сохраняться при сохранении дочернего стола. Так что это фиксированная ситуация, поэтому вам не нужно писать каскад или обратный.
5) Категория описания (понимать)
<obneced-subclass> база данных имеет таблицу родительских классов и таблица детского класса
<Union-subclass> база данных имеет таблицу подклассов и таблица родительских классов (таблица подкласса уже содержит поле Таблицы родительских классов, нет таблицы родительских классов, но имеет объект Parent Class Entity)
<subclass> база данных имеет родительский класс и класс ребенка и использует таблицу (дизайн грязный, то есть нет разделения таблиц, и он редко используется)
*7. Запрос с зимством
1) *Запрос HQL (язык запросов сгибания)
Он принадлежит к объектно-ориентированному заявлению запроса, запрашивающему POJO, нанесенный Hibernate, тем самым реализуя запрос базы данных.
а Используйте невидимый ключ для условного запроса
-Кондиционерные параметры? Указывает, что Query.setString (0, "");
-Условные параметры представлены: x, Query.setString ("x", "");
Пример кода:
<span style = "font-size: 14px;"> // тест на вопрос условного запроса с помощью неприемного ключа @test public void testfind1 () {string hql = "из службы, где account.id =? и unixhost =?"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Query.SetInteger (0, 1011); Query.setString (1, "192.168.0.23"); List <service> list = Query.list (); для (Сервис S: List) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } // эквивалентно TestFind1, используя ": идентификатор" вместо @Test public void testfind2 () {string hql = "из службы, где account.id =: apid и unixhost =: host"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Query.SetInteger ("помощь", 1011); Query.setString ("Host", ", 192.168.0.23"); List <service> list = Query.list (); для (Сервис S: List) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } </span> беременный Запросить только некоторые атрибуты
-Возвращенный по умолчанию инкапсулированная коллекция является объектом []
-Новая служба (ID, Unixhost, Osusername) инкапсулирует сервисный объект в возвращенную комбинацию.
Уведомление:
Конструктор, которому необходимо добавить ответ в службу;
Не выбросьте конструктора без параметра;
Пример кода:
<span style = "font-size: 14px;"> // Получить некоторые результаты поля и использовать объект [] для инкапсуляции данных по умолчанию @test public void testfind3 () {string hql = "select s.id, s.unixhost, s.osusername из сервиса s, где s.account.id =?"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Query.SetInteger (0, 1011); Список <object []> list = Query.list (); for (object [] objs: list) {System.out.println (objs [0] + "" + objs [1] + "" + objs [2] + ""); } session.close (); } // эквивалент testfind3, вам необходимо добавить соответствующий конструктор @test public void testfind4 () {string hql = "Выберите новый сервис (s.id, s.unixhost, s.osusername) из службы s, где s.account.id =?"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Query.SetInteger (0, 1011); List <service> list = Query.list (); для (Сервис S: List) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } </span> в Определение HQL находится в файле конфигурации (просто поймите)
-Определить HQL в файле конфигурации через элемент запроса
-Элемент Query написан за классом
-session.getnamedquery (hql name);
Пример кода: <Query/> и <class/> размещаются в HBM.XML на том же уровне
<span style = "font-size: 14px;"> <Query name = "findall"> <!-Включите простые текстовые поля в CDATA, чтобы предотвратить специальные символы-> <! [CDATA [From Service]]> </Query> </span> <span Style = "Font-Size: 14px;"> // define hql in hbl. testfind5 () {session session = hibernateutil.getsession (); // Получить оператор HQL, определенный в <Query> в HBM.XML Query Query = session.getNamedQuery ("findall"); List <service> list = Query.list (); для (Сервис S: List) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } </span> дюймовый Запрос на страницах
-Query Records
Query.setFirstresult ((Page-1)*pageSize);
Query.SetMaxResults (PageSize);
-Query Общее количество страниц
Выберите счет (*) из сервиса
Пример кода:
<span style = "font-size: 14px;"> // Проверка подписки @test public void testfind6 () {int page = 2; String hql = "из заказа обслуживания от id"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); // Добавить параметры пьеса для установки Query.setFirStresult ((Page - 1) * 3); // Установить отправную точку для записей охвата, начиная с 0 Query.setMaxResults (3); // Установить максимальное количество списка сканиров System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } // Выберите count (*) из Service @Test public void testfind7 () {string hql = "select count (*) из Service"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Длинный размер = (длинный) Query.uniqueresult (); System.out.println («Общее количество записей:» + размер); session.close (); } </span> эн. Связанный запрос (просто помните один)
-Сервис S, аккаунт A
где s.account.id = a.id
-из внутреннего присоединения S.Account A
-Сбор S.Account.RealName из службы s
Суммировать:
Сходство между HQL и SQL :
-Задача, выберите, от, где, группа, заказ на пункт
-Внутреннее соединение, левое соединение и другие соединения
-Соблюдение>, <,> =, <=, в, не в, между, как и другие условия
-Отставление групповых статистических функций Count, Sum, Max, Min, Avg
Различия между HQL и SQL :
-Операторы HQL чувствительны к случаю, то есть чувствительны к случаю. Ключевые слова неразличимы.
-HQL записывает имена объектов и имена атрибутов, а не имена таблиц и имена поля
-поговорке на соединение не поддерживается
-Выбор не поддерживается *
-Функции домена не поддерживаются, такие как функция даты TO_DATE (), функция символов TO_CHAR () и т. Д.
2) Критерии запрос (не достаточно интуитивно понятный, просто понимайте)
Используйте API Hibernate для написания HQL
Критерии c = session.createcriteria (service.class);
Пример кода:
<span style = "font-size: 14px;"> // Использовать API Hibernate для написания hql @test public void testfind1 () {session = hibernateutil.getSession (); Критерии c = session.createcriteria (service.class); C.Add (RESTRICTIONS.AND (RESTIRCTIONS.Like («OSUSERNAME», «HUANG%»), RESTRICTIONS.EQ («UNIXHOST», «192.168.0.26»))); // Добавление условий запроса <Servate> List = C.List (); // выполнять запрос, если нет настройки первинирования, проверьте все значения. Приложение Sort // c.setfirstresult (arg0); // pagination // c.setmaxresults (arg0); для (Сервис S: List) {System.out.println (s.getid () + "" + s.getosusername () + "" + s.getunixhost ()); } session.close (); } </span> 3) SQL -запрос
Непосредственно помочь нам позвонить JDBC для выполнения запросов SQL
Sqlquery sqlquery = session.createSqlQuery (sql);
Пример кода:
<span style = "font-size: 14px;"> @test public void testfind1 () {string sql = "select * from service"; Session Session = hibernateutil.getSession (); Sqlquery sqlquery = session.createSqlQuery (sql); sqlquery.setfirstresult (0); // pagination sqlquery.setmaxResults (3); // По умолчанию массив используется для инкапсуляции списка записей <object []> list = sqlquery.list (); for (object [] objs: list) {System.out.println (objs [0] + "" + objs [2]); } session.close (); } // То же, что и testfind1 (), укажите объект, который инкапсулирует запись @test public void testfind2 () {string sql = "select * from service"; Session Session = hibernateutil.getSession (); Sqlquery sqlquery = session.createSqlQuery (sql); sqlquery.setfirstresult (0); // pagination sqlquery.setmaxResults (3); // Укажите класс объектов, который инкапсулирует запись sqlquery.addentity (service.class); // инкапсулировать запись с указанным списком типов службы <sersion> list = sqlquery.list (); Для (Сервис S: List) {System.out.println (s.getid () + "" + s.getoSuserName ()); } session.close (); } </span>8. С Worderate Advanced Features (понимание)
1) Кэш 2 уровня
а Кэш 2 уровня (по умолчанию OFF)
-Кэш второго уровня-это кэш на уровне SessionFactory, который управляется SessionFactory
-кэшированный объект также является объектом объекта
-Кэшированные данные могут быть переданы между разными сессиями
-Применяемая среда: часто общие данные объекта; Небольшая частота изменения данных объектов
беременный Шаги для использования кэша уровня 2
-Dire Cache Package ehcache.jar
-Иимпорт кэша файла ehcache.xml
-in hibernate.cfg.xml, установив, чтобы включить вторичный кэш и установить класс драйвера кэша
<span style = "font-size: 14px;"> <!-Использование кэша уровня 2-> <name = "hibernate.cache.use_second_level_cache"> true </propetion> <!-Укажите класс драйвера ehcache.jar-> <свойство name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </property> </span>
-Установите элемент в файле реляционного отображения hbm.xml Pojo, чтобы быть кэшированным <cache usage = "readonly"/>
Пример кода:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testfind1 () {// Для первого запроса используйте Session1 Session1 = hibernateutil.getSession (); Сервис S1 = (Service) Session1.get (Service.class, 2002); System.out.println (s1.getOsuserName () + "" + s1.getUnixhost ()); session1.close (); // Второй запрос использует Session2 (после настройки вторичного кэша, оба запроса перейдут во вторичный кэш для получения данных) // hibernateutil.getSessionFactory (). Exict (service.class); // После удаления вы все еще дважды запросите. Session Session2 = hibernateutil.getSession (); Сервис S2 = (Service) Session2.get (service.class, 2002); System.out.println (s2.getoSuserName () + "" + s2.getUnixhost ()); } </span> </span> 2) Кэш запроса
а Кэш запроса
Кэши уровня 1 и уровня 2 могут кэшировать только отдельные объекты. Если вы столкнетесь с результатом строки, результатом массива или коллекции списков, вы можете использовать хранилище кэша запросов.
-это можно рассматривать как кеш-специальный уровень 2
-Используемое кеш-пространство-это кэш второго уровня
-Кэш-это тип данных, кроме объекта объекта
--Платить на кэше уровня 2, он отключается по умолчанию, и кеш 2-го уровня должен быть включен, прежде чем его можно будет использовать.
беременный Используйте шаги
-Опенский кеш уровня 2
-SEET OPEN CACHE в hibernate.cfg.xml
<span style = "font-size: 14px;"> <!-Включите кэш запроса-> <name = "hibernate.cache.use_query_cache"> true </propetion> </span>
Перед запросом -query.list (), query.setcachable (true);
в Использование среды
-тот же оператор запроса, который необходимо часто выполнять
-Результаты запроса, установленное на установке содержания, частота небольшая
-не иметь слишком большого количества данных в наборе результатов. Совет: для того же SQL впервые перейдите в базу данных, чтобы запросить и выйдите из кеша несколько раз в будущем. Потому что содержание набора результатов SQL+ кэшируется
Пример кода:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testfind () {find (); System.out.println ("-------"); находить(); } private void find () {string hql = "из службы, где account.id =?"; Session Session = hibernateutil.getSession (); Query Query = session.createequery (hql); Query.SetInteger (0, 1011); // включить выполнение кэша запроса Query.setCachable (true); List <service> list = Query.list (); Для (Сервис S: List) {System.out.println (s.getid () + "" + s.getoSuserName ()); }} </span> </span>9. Связанная одновременная процессинга
Например:
Моделируйте механизм покупки билетов 12306, предполагая, что в настоящее время есть билет (ID, линия, сумма, версия) билетов поезда, и имитируйте сценарий, в котором несколько человек приобретают билеты одновременно.
1) Пессимистический замок
-Программа является пессимистичной, что у каждого посетителя есть проблема с параллелизмом, поэтому каждый кусок данных будет заблокирован. Затем, только когда текущий посетитель, удерживающий блокировку, выпускает блокировку, следующий посетитель может получить доступ к данным. Этот механизм называется пессимистичным замком.
-то есть вы должны заблокировать данные, независимо от того, независимо от того, будут ли данные иметь параллелизм.
--Функции
Низкая эффективность и высокая безопасность
--выполнить:
get (class, id, lockmode.upgrade)
Выберите * из EMP для обновления
Примечание. Здесь мы используем пункт об обновлении, который поставляется с базой данных для блокировки, а не механизм блокировки, изобретенный самой Hibernate.
2) Оптимистическая блокировка
-Программа оптимистична, что у каждого посетителя не будет одновременных проблем, поэтому она не добавляет замки. Вместо этого, когда данные обновляются, определяется, изменилась ли версия данных. Если это изменится, это означает, что в этот период существует одновременное явление. Поэтому сообщается об ошибке, и обновление не удалось.
-С помощью поля версии, когда первый пользователь обновляет и подчиняется, Hibernate будет обновлять поле по 1, так что поле версии объекта, представленное последующим пользователем, меньше, чем в базе данных, то есть, когда версия будет изменена во время обновления, исключение будет выбрано, и обновление потерпит неудачу.
-один успех, другие неудачи
--Функции
Высокая эффективность, плохой пользовательский опыт
--выполнить
а Вам нужно добавить поле версии в таблицу, чтобы записать версию данных;
беременный Добавить атрибуты версии в класс Entity;
в Конфигурация дополнительной версии в hbm.xml <name = "" type = "" column = "">
3) Как выбрать
-Если параллелизм большой, следует выбрать блокировку оптимизма
-Если параллелизм невелик, вы должны выбрать пессимистический замок
Вышеуказанное представляет собой всесторонний анализ операций, связанных с гибернатом, операций запросов, передовых функций и механизма обработки параллелизма, введенного вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!