Перехватчик
Говоря о перехватчике, я считаю, что детская обувь, знакомая со Struts2, определенно знакомы со Struts2. Struts2 может настроить перехватчик для выполнения серии связанных работ, которые вы хотите. И перехватчик, о котором мы здесь говорим, также имеет аналогичные функции.
Не говоря, чушь, просто код:
Ниже приведен класс MyInterceptor, который реализует интерфейс Interceptor:
public String OnPreArestatement (String arg0) {return arg0; } public boolean onsave (Object arg0, serializable arg1, object [] arg2, string [] arg3, type [] arg4) throws callbackexception {if (arg0 ancessionof user) {System.out.println («Пользователь, чтобы быть сохраненным =>»+((пользователь) arg0) .getName ()); } вернуть false; } Я не буду читать другие методы, просто следуя реализации по умолчанию. Нам нужно только изменить эти два метода. Нам нужно изменить возвратное значение в OnPreArestatement, чтобы вернуть текущий оператор SQL. Параметры - это выполненный оператор SQL.
В Onsave вы можете сказать, что это называется при сохранении. Мы можем выполнить серию работы перед сохранением.
Я считаю, что каждый может понять это, посмотрев на имена параметров.
Serializable относится к параметру номера последовательности, который относится к атрибутам, которые отображают идентификатор базы данных.
Object [] Это серия состояний, которые в настоящее время не использовались. Я буду изучать это позже. Однако API объясняет, что независимо от того, как значение в этом массиве изменяется, метод ONSAVE должен вернуть True.
String [] относится к имени атрибута, а тип [] - тип соответствующего атрибута.
1) Этот перехватчик может выполнить некоторые соответствующие операции до и после сохранения базы данных. Например, если вы хотите изменить данные и добавить префикс или суффикс, вы можете использовать их для их реализации. Давайте посмотрим на это ниже.
public boolean onsave (Object arg0, serializable arg1, object [] arg2, string [] arg3, type [] arg4) выбрасывает callbackexception {if (arg0 exancep user) {system.out.println ("Пользователь, чтобы быть сохраненным =>"+((пользователь) arg0) .getName ()); } // Мы добавляем 123 в качестве префикса имени здесь пользователь user = (user) arg0; user.setName ("123"+user.getName ()); вернуть ложь; }Давайте посмотрим на метод испытания:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Interceptor Interceptor = new myinteceptor (); Session Session = SessionFactory.Opensession (Interceptor); Пользователь пользователь = новый пользователь (); user.setname ("Shun"); Транзакция tx = session.beginTransaction (); session.save (пользователь); tx.commit (); session.close (); } Это очень просто, мы просто сохранили это просто. Здесь нет файлов отображения и классов объектов, просто попробуйте.
Запустите, и мы можем увидеть:
Пользователь для сохранения => Shun hibernate: вставьте в пользовательские (user_name, возраст) значения (?,?) Hibernate: Обновите набор пользователей user_name =?, Age =? где user_id =?Он обновит имя и возраст в конце, в основном потому, что мы внесли изменения в метод ONSAVE.
public Boolean Onload (Object arg0, serializable arg1, object [] arg2, string [] arg3, type [] arg4) бросает Callbackexception {if (arg0 exanceOf пользователя) {System.out.println («Пользователь должен быть загружен =>»+(arg2 [0]+»:«+arg2 [1])); } User user = (user) arg0; // Судья, какой атрибут является именем для (int i = 0; i <arg3.length; i ++) {if (arg3 [i] .equals ("name")) {user.setname ((string) arg2 [i]). Заменить ("123", "" ")); arg2 [i] = ((String) arg2 [i]). заменить ("123", ""); }} вернуть false; } Значение модифицированного атрибута при загрузке записано в методе нагрузки.
ARG0 здесь является нашим пользовательским объектом. Это еще не имеет значения. Этот метод вызывается после метода загрузки, поэтому для нас бесполезно управлять пользователем в настоящее время, а пользователь. SetName здесь - бесполезная операция. В основном в:
arg2 [i] = ((String) arg2 [i]). заменить ("123", "");
Этот код изменяет значение возвращаемого атрибута, поэтому значение в объекте пользователя, которое мы получаем в программе, также изменится. Давайте запустим метод испытания, чтобы увидеть:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Interceptor Interceptor = new myinteceptor (); Session Session = SessionFactory.Opensession (Interceptor); Пользователь пользователь = (пользователь) session.load (user.class, new long (39)); System.out.println ("Имя пользователя:"+user.getName ()); session.close (); }Глядя на результаты, мы получили:
Hibernate: выберите user0_.user_id as user1_0_0_, user0_.user_name as user2_0_0_, user0_.age as age0_0_ от пользователя user0_, где user0_.user_id =? Пользователь должен быть загружен => 123shun: 0 Имя пользователя: Shun
Мы удалили оригинал 123 и провели соответствующую обработку после фактической загрузки, но это не реальная обработка перед фактической загрузкой, и это немного подозрительно относится к спекуляциям. Но это также соображение. Interceptor может использоваться наиболее наибольшим в соответствующей обработке журналов. Например, нам необходимо соответственно войти в систему для каждой операции, поэтому перехватчик является хорошим выбором.
Коллекция
Помните, что набор, который мы использовали в предыдущих примерах, мы все еще сложили? Если вы этого не сделаете, проверьте информацию и просмотрите ее. Сегодня мы узнаем в этих коллекциях.
Давайте просто доберемся до сути.
1) Сначала давайте изучим набор. Все знают, что в пакете Java Util также есть набор. Так в чем же разница и соединение между установкой и установкой в Hibernate? Мы открываем API Hibernate, находим набор, и вы можете его увидеть.
Мы видим, что родительский класс такой коллекции Hibernate. Это абстрактный класс с серией конкретных классов реализации. Когда мы продолжаем видеть следующий метод, мы обнаруживаем, что этот класс реализует инкапсуляцию коллекции Java, поэтому мы понимаем, что так называемый набор Hibernate на самом деле только инкапсулирует набор Java.
Итак, эта характеристика, которая не позволяет дублировать элементы в наборе также в Hibernate? Ответ, конечно, да.
Мы не смотрим на это здесь. В прошлом, когда мы изучали картирование, мы напрямую ассоциировали свойства со связанными классами, но сегодня мы не такие. Мы используем другой метод, просто связываем строку, чтобы увидеть, есть ли какие -либо проблемы.
Но прежде чем посмотреть на этот вопрос, давайте посмотрим на сравнение струн в Java.
Мы видим, что родительский класс такой коллекции Hibernate. Это абстрактный класс с серией конкретных классов реализации. Когда мы продолжаем видеть следующий метод, мы обнаруживаем, что этот класс реализует инкапсуляцию коллекции Java, поэтому мы понимаем, что так называемый набор Hibernate на самом деле только инкапсулирует набор Java.
Итак, эта характеристика, которая не позволяет дублировать элементы в наборе также в Hibernate? Ответ, конечно, да.
Мы не смотрим на это здесь. В прошлом, когда мы изучали картирование, мы напрямую ассоциировали свойства со связанными классами, но сегодня мы не такие. Мы используем другой метод, просто связываем строку, чтобы увидеть, есть ли какие -либо проблемы.
Но прежде чем посмотреть на этот вопрос, давайте посмотрим на сравнение струн в Java.
public static void main (string [] args) {string s1 = "shun1"; Строка S2 = "Shun1"; System.out.println ("s1 == s2:"+(s1 == s2)); } Я считаю, что многие детские туфли знают, что ответ правда.
Прежде чем сделать пример, давайте посмотрим на наш файл отображения. Мы не будем писать классы отображения:
Это файл отображения для Tuser:
<class name = "tuser" table = "t_user" dynamic-insert = "true" dynamic-update = "true" dynamic-update = "true"> <id name = "id" column = "id"> <generator/> </id> <name = "name" type = "java.lang.string" column = "name"/> name name = "ages" java. Column = "age"/> <set name = "Adderses" cascade = "all" table = "t_address"> <ключ Column = "user_id"/> <!-<One-Many/>-> <element Column = "typed =" string "/> </set> </class>-> <element =" typed = "/> </set> </class>
Далее следует файл сопоставления адресов:
<class name = "address" table = "t_address" dynamic-insert = "false" dynamic-update = "false"> <id name = "id" column = "id" type = "java.lang.integer"> <generator /> < /id> <name = "address" = "address =" java.lang.spring " /> <moge-to-alem =" used "=" java.lang.lang.sring " /> <mogy-to-ame =" use emfore "=" used stome "=" usemed "? not null = "true"> </mary-to-one> </class>
Детские туфли видели это ясно. Я прокомментировал один к многим в наборе в Tuser и использованном элементе. Независимо от того, в чем проблема, сначала посмотрим на базу данных:
Это таблица t_address:
Вот таблица t_user:
Мы видим, что пользователь с ID 4 соответствует трем адресам. Далее, давайте посмотрим на метод испытания:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = sessionFactory.Opensession (); Tuser user = (tuser) session.load (tuser.class, new Integer (4)); Set set = user.getAddresses (); session.close (); System.out.println ("Размер адреса:"+set.size ()); } Очень простой класс запросов, только что вынул этот результат, мы увидели странное явление:
Размер адреса: 1
Это результат!
Вы обязательно скажете, это должно быть неправильно, это ошибка в Hibernate. Я должен быть счастлив здесь. Я наконец -то могу отправить ошибку. Когда я поменял работу, я мог бы громко сказать, что отправил ошибку для Hibernate. Ха -ха, но, к сожалению, это не ошибка.
Я только что сказал, что сравнение струны, которой у нас была перед тем, как проложить путь, так как же проложить ее?
Мы используем установку в файле конфигурации и связываем его с помощью строковых символов. Затем, когда он будет выведен в базе данных и поместит его в набор, он сначала определит, равны ли значения связанного символа. Здесь, поскольку наши значения равны (мы не будем копаться в том, как он сравнивается в настоящее время), нам нужно только знать, что когда мы используем строки для сравнения, мы снова попадаем в строковую ловушку в Java. Если вы узнаете, что есть только один, то удаление более хлопотно при его удалении, он удалит все те же записи.
Тогда давайте посмотрим на удаленную:
Tuser user = (tuser) session.load (tuser.class, new Integer (4)); Транзакция tx = session.beginTransaction (); Object obj = user.getAddresses (). Iterator (). Next (); user.getAddresses (). удалить (obj); tx.commit (); session.close ();
Оператор вывода с Hibernate здесь:
Hibernate: удалить из t_address, где user_id =?
Я считаю, что все знают, когда это удалить все адреса под пользователем. Нет выбора, кроме как удалить все это.
Таким образом, вам нужно обратить на это внимание в реальном развитии.
2) Мы говорили о наборе выше, кажется, что это не очень приятно использовать. Есть такая ловушка, но нет никакого пути. Набор - это тот, который мы используем больше всего, и, как правило, никто не будет напрямую связывать строки. Но многие люди по -прежнему несчастливы, поэтому Hibernate будет иметь дополнительную сумку по мере необходимости (возможно, не так, как это необходимо, возможно, некоторые люди в них недовольны, ха -ха).
Давайте сначала посмотрим на его основное использование:
Во -первых, нам нужно изменить установленную тег в предыдущем файле отображения Tuser на:
<name = "addreses" lazy = "true" table = "t_address"> <ключ Column = "user_id" /> <element Type = "string" column = "Adder" /> < /bag>
И соответствующий класс объектов должен изменить тип адресов для типа списка.
Здесь мы добавляем три адреса:
Запускаем тестовый код:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.BuildSessionFactory (); Session Session = sessionFactory.Opensession (); Tuser user = (tuser) session.load (tuser.class, new Integer (4)); System.out.println ("Размер адреса:"+user.getAddresses (). Size ()); session.close (); }
Здесь мы видим:
Размер адреса: 3
На этот раз мы можем увидеть все это, независимо от того, есть ли какие -либо повторения или нет.
Но мы просто посмотрели на проблему удаления. Сумка здесь не была решена, и нам нужно использовать Idbag. Мы видим файл конфигурации и нуждаемся в следующих модификациях:
Имя idbag = "адреса" table = "t_address" lazy = "true"> <collection-id type = "int" column = "id"> <generator /> < /collection-id> <ключ Column = "user_id" /> <element type = "string" = "Адрес" /> < /idbag>
Мы видим, что он имеет только один идентификатор коллекции, чем сумка, чтобы указать номер рекордного, который будет удален.
Когда мы повторили удаленный код:
Tuser user = (tuser) session.load (tuser.class, new Integer (4)); Транзакция tx = session.beginTransaction (); Object obj = user.getAddresses (). Iterator (). Next (); user.getAddresses (). удалить (obj); tx.commit ();
Мы видим, что выводный оператор:
Hibernate: удалить из t_address, где id =?
На этот раз он не удаляется через user_id, а на основе идентификатора t_address, что означает, что он действительно удаляет запись, которую нам нужно удалить.
Мы видим базу данных, и запись сейчас:
Мы удалили первую запись, это правильно.
3) После рассмотрения двух вышеупомянутых методов давайте посмотрим на карту. Самая большая разница между ним и вышеупомянутыми - то, что она может соответствовать значениям ключей. Посмотрите прямо на код, интуитивно понятная точка зрения:
Во -первых, нам нужно изменить файл конфигурации:
<map name = "addreses" table = "t_address" lazy = "true"> <keal column = "user_id" /> <index type = "string" column = "type" /> <element type = "string" column = "address" /> < /map>
Самая большая разница между ним и предыдущими двумя заключается в том, что существует индекс, который эквивалентен ключу карты в Java, и мы используем это для получения соответствующих записей. Помните, что после изменения здесь вам необходимо изменить соответствующий класс объектов, и вам нужно изменить тип атрибута адресов на карту.
Посмотрите на данные базы данных:
Здесь мы видим, что есть два офиса и один дом, так какой офис следует использовать?
Не волнуйтесь, мы узнаем после запуска тестового кода:
Tuser user = (tuser) session.load (tuser.class, new Integer (4)); System.out.println (user.getAddresses (). Get ("Home")); System.out.println (user.getAddresses (). Get ("Office"));Шанвай Шанхай
Да, как показывает результат, мы получаем тот, который позади, который такой же, как принцип карты. Сохраненные значения будут перезаписать предыдущие значения (если они являются одним и тем же ключом).
Карта относительно проста, что сопоставимо с первыми двумя.
4) Давайте посмотрим на последний. Список отличается от предыдущих, и он может быть отсортирован.
Давайте посмотрим, как это реализовано:
Во -первых, давайте изменим файл отображения:
<list name = "addreses" table = "t_address" lazy = "true"> <keal column = "user_id" /> <index type = "string" column = "idx" /> <element type = "string" column = " /> < /list>
Это похоже на конфигурацию карты, но атрибуты индекса различны. Индекс в карте используется в качестве ключа для получения значения, в то время как индекс списка используется в качестве сортировки.
Давайте посмотрим на базу данных:
Мы устанавливаем три значения в порядке 0, 1 и 2.
Давайте запустим код, чтобы изменить значения 0 и 2:
Tuser user = (tuser) session.load (tuser.class, new Integer (4)); Транзакция tx = session.beginTransaction (); Object obj1 = user.getAddresses (). Get (0); Object obj2 = user.getAddresses (). Get (2); user.getAddresses (). set (0, obj2); user.getAddresses (). set (2, obj1); tx.commit ();
Мы видим результаты:
Мы видим, что 0 и 2 были заменены, и, конечно, это просто изменяет значение IDX. Но это в основном реализовало функцию сортировки.