Hibernate самые полные экзаменационные вопросы

Java Hibernate Java EE

Спящий режим общие вопросы интервью

Как работает Hibernate и для чего он используется?

Как работает Hibernate и для чего он используется?

  1. Чтение и разбор файлов конфигурации
  2. Прочитайте и проанализируйте информацию о сопоставлении, создайте SessionFactory
  3. Открытая сессия
  4. Создать транзакцию
  5. постоянная операция
  6. совершить транзакцию
  7. закрыть сеанс
  8. Закрыть SessionFactory

Использование среды Hibernate избавляет нас от необходимости писать множество громоздких операторов SQL.Hibernate реализует ORM, который может отображать объекты в таблицы базы данных, что упрощает нашу разработку!

Как ленивая загрузка Hibernate (ленивая загрузка)?

Как ленивая загрузка Hibernate (ленивая загрузка)?

Устанавливая атрибутыlazyБудь то необходимость устанавливать лениво

Когда Hibernate запрашивает данные, данные не существуют в памяти,Когда программа действительно работает с данными, объект существует в памяти и реализуется ленивая загрузка., он экономит накладные расходы памяти сервера, тем самым повышая производительность сервера.

Как реализовать отношения между классами в Hibernate? (например, отношения «один ко многим», «многие ко многим»)

Как реализовать отношения между классами в Hibernate? (например, отношения «один ко многим», «многие ко многим»)

Они передаются в файле конфигурацииmany-to-one、one-to-many、many-to-manyДостичь ассоциации между классами.

Как преобразовать между тремя состояниями гибернации

Как преобразовать между тремя состояниями гибернации

Состояние объекта в Hibernate:

  • временное/переходное состояние
  • постоянное состояние
  • свободный штат

временное/переходное состояние

когда мыОбъект непосредственно новый - это временное/переходное состояние..

  • Объект не был сохранен [не сохранен в базе данных]
  • Не управляется сеансом

这里写图片描述

постоянное состояние

Когда объект хранится в базе данных, это постоянное состояние.

  • При вызове методов сохранения/сохранения или обновления/получения/загрузки/списка сеанса и других методов объект является постоянным состоянием.
  • соответствующие данные в базе данных
  • Управляется сеансом
  • При внесении изменений в свойства объекта они будут отражены в базе данных!

这里写图片描述

Давайте проверим это:При внесении изменений в свойства объекта они будут отражены в базе данных!


        session.save(idCard);
        idCard.setIdCardName("我是测试持久化对象");

这里写图片描述

свободный штат

Когда сеанс закрывается, постоянный объект становится свободным...

  • Его нет в управлении сессиями.
  • Соответствующая запись в базе данных

这里写图片描述

С приведенным выше основанием мы можем легко сказать, что преобразование между ними

  • Новый объект находится в переходном состоянии -> сохранение его в базе данных (управляемой сеансом) является постоянным состоянием -> закрытие сеанса является свободным состоянием

Сравните преимущества и недостатки трех стратегий поиска спящего режима.

Сравните преимущества и недостатки трех стратегий поиска спящего режима.

Ищи сейчас:

  • Преимущества: полностью прозрачно для приложения, независимо от того, находится ли объект в постоянном или свободном состоянии, приложение может легко переходить от объекта к связанному с ним объекту;
  • Недостатки: 1. Слишком много операторов select 2. Могут быть загружены объекты, к которым приложению не нужно обращаться, и много памяти будет потрачено впустую;
  • Ищи сейчас:lazy=false;

Отсроченный поиск:

  • Преимущества: приложение само решает, какие объекты необходимо загрузить, избегая избыточных операторов выбора и загружая объекты, к которым приложению не требуется доступ. Следовательно, можно повысить производительность поиска и сэкономить место в памяти;
  • Недостатки: если приложение хочет получить доступ к экземпляру прокси-класса свободного состояния, оно должно гарантировать, что оно было инициализировано при сохранении состояния;
  • Ленивая загрузка:lazy=true;

Срочный поиск левого внешнего соединения:

  • Преимущества: 1. Это полностью прозрачно для приложения.Независимо от того, находится ли объект в постоянном состоянии или в свободном состоянии, приложение может легко перейти от объекта к связанному с ним объекту. 2 Используется внешнее соединение, и количество операторов select невелико;
  • Недостатки: 1. Объекты, к которым приложению не требуется доступ, могут быть загружены, что приведет к потере большого объема памяти 2. Сложные соединения таблиц базы данных также повлияют на производительность поиска;
  • Предварительная выборка:fetch=“join”;

Какие стратегии кэширования поддерживает спящий режим

Какие стратегии кэширования поддерживает спящий режим

Есть 4 свойства USAGE:

  • Объекты помещаются в кеш второго уровня, только для чтения (Read-only);
  • Нестрогое чтение/запись
  • Чтение и запись; объекты, помещенные в кэш L2, могут быть прочитаны и записаны (Read/write);
  • Транзакционная политика (транзакционная)

В чем разница между отсортированной коллекцией и упорядоченной коллекцией в спящем режиме

В чем разница между отсортированной коллекцией и упорядоченной коллекцией в спящем режиме

sorted collection

  • вКомпаратором памяти Javaотсортированный

ordered collection

  • взаказать по базеотсортированный

Для больших наборов данныхЧтобы избежать OutOfMemoryError в Java при сортировке их в памяти, лучше использовать упорядоченную коллекцию.

Скажи механизм кэширования гибернации

Расскажите о механизме кэширования Hibernate.

Кэш первого уровня:

  • Кэш первого уровня в Hibernate, также известный как кеш сеанса,Это может уменьшить количество посещений базы данных в рамках сеанса! Действует только в рамках сеанса! Сессия закрыта, кэш первого уровня недействителен!
  • Пока состояние постоянного объекта управляется сеансом, то есть он будет находиться в кэше сеанса!
  • Кэш сеанса поддерживается спящим режимом,Пользователи не могут управлять содержимым кеша; если вы хотите управлять содержимым кеша, вы должны использовать метод EVIT/CLEAR, предоставляемый Hibernate..

Кэш L2:

  • Кэш второго уровня — это кеш на основе приложений, который может использоваться всеми сессиями.
  • Кэш второго уровня, предоставляемый Hibernate, имеет реализацию по умолчанию и являетсяПодключаемый фреймворк кэширования! Если пользователь хочет использовать кеш второго уровня,Просто нужно настроить в hibernate.cfg.xml; Не хотите использовать, просто удалите, на код не влияет.
  • Если пользователи считают, что инфраструктура, предоставляемая спящим режимом, непроста в использовании,Вы можете перейти на другие фреймворки кэширования или реализовать свою собственную фреймворк кэширования..
  • Спящий кэш второго уровня:Часто используемые классы хранятся

这里写图片描述

Есть несколько способов запроса гибернации.

Существует несколько способов запроса Hibernate

  • Запрос навигации по объекту (объектная композиция)
  • HQL-запрос
    • 1. Запрос атрибутов
    • 2. Запрос параметров, запрос именованных параметров
    • 3. Связанный запрос
    • 4. Пейджинговый запрос
    • 5. Статистические функции
  • Критерий запроса
  • Собственный SQL-запрос SQLQuery

Как оптимизировать спящий режим?

Как оптимизировать спящий режим?

  • Ø Корректировка дизайна базы данных
  • Ø HQL-оптимизация
  • Ø правильное использование API (например, выбор различных API запроса и в зависимости от типа службы)
  • Ø Основные параметры конфигурации (журнал, кеш запросов, fetch_size, batch_size и т. д.)
  • Ø Оптимизация файла карты (стратегия генерации идентификаторов, кэш L2, отложенная загрузка, оптимизация ассоциаций)
  • Ø Управление кешем 1-го уровня
  • Ø Для кэша второго уровня существует множество уникальных стратегий

Для получения подробной информации см.:

Разговор о роли inverse в Hibernate

Разговор о роли inverse в Hibernate

Инверсное свойство по умолчанию имеет значение false, то есть оба конца связи поддерживают связь.

  • Например, у учеников и учителей есть отношения «многие ко многим», которые поддерживаются промежуточной таблицей «Учитель-ученик». гп)
  • Если inverse=”true” на стороне Student, то связь поддерживается на другом конце Учителем, то есть при вставке Student таблица TeacherStudent (промежуточная таблица) не будет работать. Операция в промежуточной таблице запускается только тогда, когда Учитель вставляет или удаляет. Таким образом, неверно иметь inverse="true" на обеих сторонах, что приведет к тому, что любая операция не вызовет влияния на промежуточную таблицу; когда обе стороны имеют inverse="false" или значение по умолчанию, это приведет к тому, что отношение будет дважды вставлен в промежуточную таблицу.

Если связь между таблицами "один ко многим", то обратную можно настроить только на "одной" стороне!

Для получения подробной информации см.:

Разница между спящим режимом JDBC и ибатисом

Разница между спящим режимом JDBC и ибатисом

jdbc: руководство

  • писать sql вручную
  • Удалить, вставить, обновление должно вынимать значение объекта один за другим и передавать его на SQL и не могу напрямую пройти в объекте.
  • select: возвращается набор результатов, который необходимо извлекать из ResultSet строка за строкой, поле за полем, а затем инкапсулировать в объект вместо того, чтобы возвращать объект напрямую.

Особенности ибатиса: Полуавтоматический

  • sql писать вручную
  • удалить, вставить, обновить: напрямую передать объект
  • select: вернуть объект напрямую

спящий режим: полностью автоматический

  • Не писать sql, автоматически инкапсулировать
  • удалить, вставить, обновить: напрямую передать объект
  • select: вернуть объект напрямую

Как оптимизировать, когда скорость условного запроса в базе данных очень низкая?

Как оптимизировать, когда скорость условного запроса в базе данных очень низкая?

  1. показатель
  2. Уменьшение корреляции между таблицами
  3. Оптимизируйте sql, попытайтесь позволить sql быстро находить данные, не позволяйте sql выполнять полный запрос таблицы, вы должны использовать индекс и поместить таблицу с большим объемом данных впереди
  4. Упростите поля запроса, не используйте бесполезные поля, контролируйте возвращаемые результаты и старайтесь возвращать небольшой объем данных.

Для получения подробной информации см.:

Что такое SessionFactory и является ли он потокобезопасным?

Что такое SessionFactory и является ли он потокобезопасным?

Sessleton Hibrenate Singleton Sessionfactory - это безопасное хранение данных, и что может одновременно получить доступ к нескольким потокам.一个SessionFactory 在启动的时候只能建立一次。 SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.

Разница между получением и загрузкой

Разница между получением и загрузкой

  • get() запрос немедленно

这里写图片描述

  • load() ленивая загрузка

这里写图片描述

  • 1) get вернет null, если он не найден, и load выдаст исключение, если он не найден.
  • 2) get сначала проверит кеш первого уровня, затем кеш второго уровня, а затем базу данных; load сначала проверит кеш первого уровня, если не найдет, создаст прокси-объект, а затем запросит второй уровень кеш и база данных, когда это необходимо.

Смысл слияния:

Смысл слияния:

  • если сессияЭкземпляры одного и того же постоянного идентификатора существуют, с состоянием объекта, заданным пользователемПерезаписать старый постоянный экземпляр
  • если сессияНет соответствующего постоянного экземпляра, затем попробуйте загрузить из базы данных или создать новый постоянный экземпляр и, наконец, вернуть постоянный экземпляр
  • Объект, предоставленный пользователем, не связан с сеансом, он по-прежнему отключен

Для получения подробной информации см.:

Разница между сохранением и сохранением

Разница между сохранением и сохранением

  • persist не гарантирует немедленного выполнения, возможно, придется подождать до сброса;
  • сохраняться не обновлять кеш;
  • сохранить, постоянный идентификатор временного экземпляра генерируется вовремя, он должен вернуть идентификатор, поэтому он будетВыполнить вставку Sql немедленно
  • При сохранении постоянных объектов с помощью метода save()Этот метод возвращает значение атрибута идентификации постоянного объекта (т. е. значение первичного ключа соответствующей записи);
  • При использовании метода persist() для сохранения постоянных объектовЭтот метод не имеет возвращаемого значения.

Использованная литература:

Каковы стратегии генерации первичных ключей

Каковы стратегии генерации первичных ключей

Стратегия автоматической генерации первичного ключа

  • саморазвитие личности (mysql, db2)
  • Саморост последовательности (sequence), саморост в оракуле реализован методом последовательности**
  • Родительный саморазовый [идентичность или последовательность будет выбран в соответствии с методом самопоступления базовой базы данных]
    • Если это база данных mysql, используется метод саморазвития.
    • Если это база данных оракула, используйте последовательность последовательностей для достижения саморазвития.
  • Инкремент растет автоматически (будут проблемы с одновременным доступом, как правило, в среде кластера серверов будут проблемы).

Укажите стратегию генерации первичного ключа какВручную указать значение первичного ключа

  • assigned

Укажите стратегию генерации первичного ключа какСгенерированное значение UUID

  • uuid

иностранный (способ внешних ключей)

Кратко опишите разницу между getCurrentSession и openSession в спящем режиме

Кратко опишите разницу между getCurrentSession и openSession в спящем режиме

  • 1. getCurrentSession свяжет текущий поток, а openSession — нет, потому что после того, как мы передаем hibernate нашей Spring для управления, у нас есть конфигурация транзакции, и этот транзакционный поток будет связывать каждый сеанс в текущей фабрике, а openSession — создавать новый сессия.
  • 2,Транзакция getCurrentSession управляется Spring, а openSession требует, чтобы мы вручную открывали и вручную фиксировали транзакции,
  • 3.getCurrentSession не требует от нас закрытия вручную, потому что фабрика будет управлять им сама, а openSession требует, чтобы мы закрыли его вручную.
  • 4. ИgetCurrentSession требует, чтобы мы вручную установили механизм привязки транзакций, Существует три метода настройки: jdbc local Thread, JTA, третий — механизм управления транзакциями org.springframework.orm.hibernate4.SpringSessionContext, предоставляемый Spring, и srping использует этот механизм управления транзакциями по умолчанию.

На что ссылается названный запрос SQL в Hibernate?

На что ссылается именованный SQL-запрос в Hibernate?

  • Именованный запрос относится к использованию<sql-query>Тег определяет SQL-запрос в документе сопоставления, который можно вызвать с помощью метода Session.getNamedQuery(). Именованные запросы позволяют вам получить конкретный запрос, используя указанное вами имя.
  • Именованные запросы в Hibernate могут быть определены с помощью аннотаций или с помощью вопроса-инсинуации xml, о котором я упоминал ранее. В Hibernate @NameQuery используется для определения одного именованного запроса, а @NameQueries используется для определения нескольких именованных запросов.

Почему важно предоставлять конструктор без параметров в классах сущностей Hibernate?

Почему важно предоставлять конструктор без параметров в классах сущностей Hibernate?

Каждый класс Hibernate Entity должен содержать конструктор без параметра, потому чтоЧтобы использовать API Reflection фреймворка Hibernate, для создания экземпляра класса сущности вызовом Class.newInstance(). Если в классе сущностей не найден конструктор без параметров, этот метод создает исключение InstantiationException.

Можно ли определить классы сущностей Hibernate как окончательные классы?

Можно ли определить классы сущностей Hibernate как окончательные классы?

тыМожетОпределение классов сущности гиберната как финал не является хорошей практикой. Поскольку Hibernate будет использовать шаблон прокси для повышения производительности в случае отсроченной ассоциации, если вы определяете класс объекта как окончательный класс,Потому что Java не позволяет расширить последний класс, поэтому Hibernate больше не может использовать прокси,Это ограничивает использование средств для повышения производительности.

Наконец

Использованная литература:


Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y