аннотация
Аннотация Hibernate - это последний метод, который не использует XML -файлы для определения отображений. Аннотации могут использоваться в метаданных картирования XML, которые разделены или заменены.
Аннотации Hibernate - это мощный способ обеспечить отображения объектов метаданных и реляционных таблиц. Все метаданные призывают вместе с файлом Pojo Java. Это может помочь пользователям понять структуру таблицы и POJO в процессе разработки.
Если вы намереваетесь перенести приложение в другие специфичные для EJB3 приложения ORM, вы должны использовать аннотации для представления информации о отображении, но если вы хотите большую гибкость, вам следует использовать отображение на основе XML.
Установка аннотации Hibernate В среде Сначала вы должны убедиться, что вы используете JDK5.0, в противном случае вам необходимо обновить JDK до нативной поддержки JDK5.0 с помощью аннотаций.
Во-вторых, вам необходимо установить пакет дистрибуции Annotation Hibernate 3.x, вы можете использовать SourceForge: (загрузить аннотацию Hibernate) и копию Hibernate-annotation.jar, lib/hibernate-comons-annotation.jar и lib/ejb3-persistence.jar на назначение от аннотаций Hibernate в классные аннотации.
Комментированный экземпляр класса:
Как уже упоминалось, все метаданные, которые работают с гибельными аннотационными аннотациями, работают в файле Pojo Java выше, могут помочь пользователям понять как структуру таблицы, так и POJO во время разработки.
Рассмотрим объект, который будет храниться с помощью следующей таблицы сотрудников:
Создание таблицы сотрудники (id int not null auto_increment, first_name varchar (20) по умолчанию NULL, last_name varchar (20) по умолчанию NULL, зарплата int по умолчанию NULL, первичный ключ (ID));
Ниже приведено отображение класса работника Object с аннотациями для карты с определенной таблицей сотрудников:
Импорт javax.persistence.*; @entity @table (name = "employtee") Public Class Employee {@id @generatedValue @column (name = "id") private int id; @Column (name = "first_name") частная строка FirstName; @Column (name = "last_name") частная строка lastname; @Column (name = "зарплата") частная зарплата; public employee () {} public int getId () {return id; } public void setId (int id) {this.id = id; } public String getFirstName () {return FirstName; } public void setFirstName (string first_name) {this.firstName = first_name; } public String getLastName () {return LastName; } public void setlastName (String last_name) {this.lastName = last_name; } public int getSalary () {return Parlary; } public void setSalary (int Parlary) {this.Salary = зарплата; }}Hibernate обнаруживает, что аннотация @ID противоречит поле и предполагает, что она должна получить доступ к свойствам объекта непосредственно через домен времени выполнения. Если @ID аннотирован методом getID (), свойство будет доступно по умолчанию с помощью методов Getter и Setter. Следовательно, все остальные комментарии также размещаются в методе поля или геттера, как выбран ниже политики. В следующем разделе объясняются комментарии, используемые в вышеуказанном классе.
@Entity аннотация:
Описание спецификации EJB3 включено в пакет javax.persistence, поэтому мы импортируем этот пакет в качестве первого шага. Во -вторых, мы использовали аннотацию @Entity, чтобы отметить этот класс как класс сотрудников Bean, поэтому он должен иметь конструктор без параметра, который, наконец, виден с защитой.
@Table аннотация:
Аннотация @Table позволяет использовать указанную таблицу для хранения подробной информации о объекте в базе данных.
Аннотация @Table предоставляет четыре свойства, которые позволяют переопределить имя таблицы, ее каталог, ее схема и выполнять уникальные ограничения на столбцах в таблице. Теперь мы используем имя таблицы сотрудников только сейчас.
@Id и @generatedvalue аннотации:
Каждый фасоль предприятия будет иметь первичный ключ, аннотированный в аннотации @ID класса. Первичным ключом может быть одно поле или комбинация нескольких полей в соответствии со структурой таблицы.
По умолчанию аннотация @ID автоматически определяет наиболее подходящую стратегию генерации первичных ключей для использования, но ее можно использовать, применяя аннотацию @GeneratedValue, которая принимает два параметра, стратегию и генератор, не обсуждая здесь, просто используйте стратегию генерации ключей по умолчанию по умолчанию. Пусть Hibernate определит тип генератора для использования для создания переносимости кода между различными базами данных.
@Column Annotation:
Аннотация @column используется для указания деталей столбца в поле или свойство, которое будет сопоставлено. Следующие наиболее часто используемые свойства могут быть аннотированы с использованием столбцов:
Атрибут имени позволяет четко указать имя столбца.
Свойство длины позволяет отобразить размер столбца, который особенно для строкового значения.
Нулевое свойство позволяет пометить столбца не при генерации схемы.
Уникальное свойство позволяет столбцам, помеченным как содержащие только уникальные значения.
Создайте класс приложений:
Наконец, мы создадим метод Main () класса приложения для запуска приложения. Мы будем использовать это приложение для сохранения некоторых записей сотрудников, а затем подать заявку на записи о операциях CRUD.
импортировать java.util.list; импортировать java.util.date; импортировать java.util.iterator; Импорт org.hibernate.hibernateException; Импорт org.hibernate.session; Импорт org.hibernate.transaction; импорт org.hibernate.cfg.annotationConfiguration; импорт org.hibernate.sessionFactory; Import org.hibernate.cfg.configuration; Public Class Managemployee {Private Static Factory Factory; public static void main (string [] args) {try {factory = new AnnotationConfiguration (). configure (). //addpackage("com.xyz ") // Добавить пакет при использовании. AddannotatedClass (сотрудник. Class). buildSessionFactory (); } catch (throwable ex) {System.err.println ("Не удалось создать объект SessionFactory." + ex); бросить новый ExceptionInitializerError (Ex); } ManageMployee me = new ManageMployee (); / * Добавить несколько записей сотрудников в базу данных */ integer empid1 = me.addemployee ("Zara", "ali", 1000); Integer EmpiD2 = me.addemployee ("Daisy", "das", 5000); Integer EmpiD3 = me.addemployee («Джон», «Пол», 10000); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи сотрудника */ me.updateemployee (Empid1, 5000); / * Удалить сотрудника из базы данных */ me.deleteemployee (Empid2); / * Перечислите новый список сотрудников */ me.listemployee (); } / * Метод для создания сотрудника в базе данных * / public Integer AddeMployee (String fname, String lname, int Parlary) {session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (); employee.setfirstname (fname); employee.setlastname (lname); сотрудник.setsalary (зарплата); employeeeid = (целое число) сессия. SSAVE (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } return employeeid; } / * Метод для прочтения всех сотрудников * / public void listeMportees () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Список сотрудников = session.createequery ("от сотрудника"). List (); for (iterator iterator = сотрудники.iterator (); iterator.hasnext ();) {employtee employee = (employtee) iterator.next (); System.out.print («Имя:» + employee.getFirstName ()); System.out.print («Фамилия:» + employee.getlastname ()); System.out.println ("Зарплата:" + employee.getsalary ()); } tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод для обновления зарплаты для сотрудника * / public void updatemployee (Integer employeeid, int заработная плата) {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Сотрудник сотрудников сотрудника = (работник) Session.get (employtee.class, employeeeid); сотрудник.setsalary (зарплата); Session.Update (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод удаления сотрудника из записей * / public void deleteemployee (Integer employeeid) {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Сотрудник сотрудников сотрудника = (работник) Session.get (employtee.class, employeeeid); session.delete (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }}} Конфигурация базы данных:
Теперь давайте создадим файл конфигурации hibernate.cfg.xml, чтобы определить соответствующие параметры базы данных.
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.bhibernate.dialect.mysqlidialect </property> <name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-Предположим, что студенты являются названием базы данных-> <propatore = "hibernate.connection.url"> jdbc: mysql:/costhost/properation/property-fpropation/test> name = "hibernate.connection.username"> root </property> <name = "hibernate.connection.password"> cohondob </property> </session-factory> </hibernate-configuration>
Скомпилируйте и выполните:
Вот шаги для компиляции и запуска вышеуказанного приложения. Убедитесь, что Path и Classpath устанавливаются надлежащим образом перед компиляцией и выполнением.
Удалить файл отображения сотрудников.hbm.xml с пути.
Создайте исходный файл employeee.java, как показано на приведенном выше изображении, и составьте его.
Создайте исходный файл ManageMployee.
Выполните бинарный файл ManageMployee для запуска программы.
Будут получены следующие результаты, и записи будут в таблице работников.
$ java ManageMployee ......... различные сообщения журнала будут отображаться здесь ......... Имя: Zara Fabry: ALI ЗАДЕРЖА
Если вы проверьте таблицу работников, она должна иметь следующие записи:
mysql> выберите * из сотрудника;+----+------------+-----------+--------+| id | first_name | last_name | Зарплата |+----+------------+-----------+--------+| 29 | Zara | Али | 5000 || 31 | Джон | Пол | 10000 |+----+------------+-----------+--------+2 ряда в наборе (0,00 секмискля>
кеш
Кэширование-это все о оптимизации производительности приложения, и оно расположено между приложением и базой данных, чтобы избежать нескольких доступа к базе данных, и позволяют критическим приложениям, критичным производительности, работать лучше.
Кэширование важно для Hibernate, и оно принимает многоуровневую схему кэширования, описанную ниже:
Кэш 1 -го уровня:
Кэш первого уровня - это кэш сеанса, который является обязательным кешем, и все запросы через него должны быть переданы. Объекты сеанса постоянно работают по объектам, прежде чем отправлять их в базу данных.
Если выпущены несколько обновлений, Hibernate пытается отложить обновления на как можно дольше, чтобы уменьшить количество выпущенных операторов SQL. Если вы закрываете сеанс, все кэшированные объекты будут потеряны, либо настойчивы, либо обновлены в базе данных.
Кэш 2 уровня:
Кэш 2 -го уровня является необязательным и кэшем уровня 1, который всегда будет искать до любой попытки найти кэш объекта 2 уровня 2. Кэш второго уровня может быть настроен на основе для каждого класса и для категории, главным образом ответственным за объекты, кэшированные в сеансе.
Любой сторонний кэш может использовать Hibernate. Интерфейс org.hibernate.cache.cacheprovider предоставляет, и необходимо реализовать реализацию кэша ручки для обеспечения Hibernate.
Кэш уровня запросов:
Hibernate также реализует жесткую интеграцию кеша результатов запроса и кэша уровня 2.
Это необязательная функция, которая требует двух дополнительных физических кэша для сохранения кэшированных результатов и регионов, когда таблица в последний раз обновляется. Это очень полезно для запросов, которые часто работают с теми же параметрами.
Кэш 2 уровня:
Hibernate использует кэш уровня 1, по умолчанию вы ничего не делаете с кэшем уровня 1. Давайте перейдем к опциональному кешу второго уровня. Не все классы извлекают выгоду из кэширования, поэтому важно отключить кэш уровня 2.
Кэш Hibernate уровня 2 установлен на два шага. Во -первых, вы должны решить, какую стратегию параллелизма использовать. После этого вы можете настроить истечение срока действия кэша и использовать кэш для обеспечения атрибутов физического кэша.
Стратегия параллелистики:
Политика параллелизма является посредником, ответственным за хранение элементов данных в кэше и получение их из кэша. Если вы хотите включить кэширование уровня 2, вам придется решить, какую политику параллелизма кэша использовать для каждого постоянного класса и сбора.
Транзакция: использование этой стратегии для в первую очередь чтение данных для предотвращения параллельных транзакций устаревших данных имеет решающее значение в редких случаях обновлений.
Read-Write: Опять же, используя эту стратегию. Основное чтение данных имеет решающее значение для предотвращения одновременных транзакций из устаревших данных в редких случаях обновлений.
НЕПРАВЛЕНИЕ-ЧИТАНСКИЙ ВИТ: Эта стратегия не гарантирует согласованность между кэшем и базой данных. С помощью этой стратегии ключ не в том, чтобы обращать внимание, если данные редко изменяются, а возможность устаревших данных должна быть устаревшей.
Только для чтения: Политика параллелистики подходит для данных и никогда не изменится. Используемые данные предназначены только для справки.
Если мы хотим использовать кэш второго уровня в качестве нашего класса сотрудников, давайте добавим элементы отображения, необходимые для того, чтобы сообщить Hibernate для использования читаемой и писательской политики кэша для экземпляров сотрудника.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "class-description"> Этот класс содержит детали сотрудника. </meta> <cache usage="read-write"/> <id name="id" type="int" column="id"> <generator/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping>
Свойство usage = "read-write" сообщает Hibernate использовать кэш, определяемый политикой параллелизма чтения-записи.
Поставщик кэша:
После рассмотрения политики параллелистики вашего класса кандидата в кеш, следующим шагом является выбор поставщика кэша. Священные силы выбирают кэш для обслуживания всего приложения.
Кэш, предоставленный в указанном файле конфигурации hibernate.cfg.xml. Выберите ehcache в качестве поставщика кэша второго уровня:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.bhibernate.dialect.mysqlidialect </property> <name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-Предположим, что студенты являются названием базы данных-> <propatore = "hibernate.connection.url"> jdbc: mysql:/costhost/properation/property-fpropation/test> name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> root123 </property> <name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </propetion> <! resource = "employee.hbm.xml"/> </session-factory> </hibernate-configuration>
Теперь вам нужно указать свойства области кеша. Ehcache имеет свой собственный файл конфигурации ehcache.xml, в приложении в классе. В ehcache.xml конфигурация кэша класса сотрудников может выглядеть так:
<diskstore path = "java.io.tmpdir"/> <defaultCaccheMaxElementsInMemory = "1000" Eternal = "false" TimeDoidLeseconds = "120" TimeToliveseConds = "120" OupFlowToDisk = "true"/> <CACHE name = "employee" maxelementsinmemory = "500" eternal = "true" timeToidLeseconds = "0" timetoliveseconds = "0" upflowTodisk = "false"/>
Вот и все, теперь включите вторичный кэш и Hibernate в классе работника, теперь есть вторичный кэш, когда просмотр сотрудника или когда сотрудник загружается идентификатором.
Вы должны проанализировать все свои классы и выбрать соответствующую стратегию кэширования для каждого класса. Иногда вторичный кэш может ухудшить производительность приложения. Таким образом, это рекомендуется для эталонного приложения, которое не включает кэширование в первый раз, что очень подходит для кэширования и проверки производительности. Если кэш не улучшает производительность системы, не имеет смысла делать какой -либо тип кэша.
Кэш уровня запросов:
Используя кэш запроса, он должен быть активирован сначала в файле конфигурации свойств hibernate.cache.use_query_cache = "true". Если это свойство установлено на True, пусть Hibernate создает необходимый кэш в памяти, чтобы сохранить набор запросов и идентификатора.
Затем, используя кэш запросов, вы можете использовать метод SETCACHALE (BOOLEAN) класса запросов. Например:
Hibernate также поддерживает очень мелкозернистую поддержку кеша посредством концепции области кеша. Кэш является частью кэша, данного названием.
В этом коде используется метод, чтобы сообщить Hibernate для хранения и поиска запросов на сотрудников в кэше.