Спящие и хранимые процедуры - PullRequest
2 голосов
/ 08 марта 2010

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

  • файл метаданных таблицы (person.hbm.xml), включая отображение всех полей
  • Java-объект (person.java)

Если мы используем хранимые процедуры для всех транзакций, нужна ли нам указанная выше конфигурация?

Кажется, что спящие и хранимые процедуры будут перекрываться,

Мы настроили хранимую процедуру, потому что не хотим, чтобы разработчик знал все поля в db. Если таблицы меняются, нам нужно обновить вышеуказанные файлы.

Означает ли это, что если мы используем исключительно хранимую процедуру, нам следует просто перейти на JDBC?

Если в спящем режиме, мы должны оставаться в HQL?

Ответы [ 4 ]

2 голосов
/ 08 марта 2010

Вы можете использовать собственный SQL и отобразить результат на объект:

sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);

Синтаксис JDBC для вызова процедуры хранения выглядит следующим образом:

CallableStatement proc =
connection.prepareCall("{ call set_death_age(?, ?) }");
proc.setString(1, poetName);
proc.setInt(2, age);

Так что возможно , вы можете вызвать хранимую процедуру и сопоставить ее с объектом:

  sess.createSQLQuery("{ call my_stored_proc }").addEntity(Cat.class);

Также обратите внимание, что обновления , выполненные с помощью хранимых процедур, выйдут из режима гибернации, а это значит, что вам придется выселять объекты из 1-го уровня и 2-го уровня кеш самостоятельно.

Итак, как вы видите, гибернация и хранимая процедура на самом деле не подходят друг другу естественным образом .

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

Если вас беспокоит безопасность , используйте:

  • просмотров базы данных
  • Привилегии столбца Oracle
  • предоставляет файлы сопоставления и запрещает их модификацию разработчиками
1 голос
/ 08 марта 2010

Можно использовать native-sql и использовать хранимую процедуру для запроса ограничениями / правилами ). Но, как написано в документации:

Хранимые процедуры в настоящее время возвращают только скаляры и сущности. <return-join> и <load-collection> не поддерживаются.

Поэтому, если вы хотите работать с неуправляемыми объектами (т.е. не скалярами в Object[]), вам придется применить ResultTransformer в коде.

Но, в конце концов, если вы хотите скрыть базу данных для разработчиков, если вы не хотите отображать объекты в таблицы, если вы не хотите работать с ассоциациями, если вы не хотите использовать HQL Если вы не хотите использовать ОО-подход, то мне действительно интересно, почему вы хотите использовать Hibernate. Вам лучше использовать необработанный JDBC (например, с Spring) или, возможно, средство отображения данных, например iBATIS.

0 голосов
/ 08 марта 2010

Использование Hibenate с хранимыми процедурами является определенным совпадением. Так как вам, например, нужно написать процедуру для INSERT, UPDATE, DELETE и SELECT, Hibernate предоставляет самый простой способ взаимодействия с объектами реляционной базы данных, отображая их в файлы метаданных, как вы упомянули person.hbm.xml.

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

Что касается хранимых процедур, одним из рекомендуемых способов является настройка ваших хранимых процедур в виде именованных запросов из файла конфигурации. Это, однако, заставляет вас упускать лучший потенциал, на мой взгляд, Hibernate.

Это отвечает на ваш вопрос? Вам нужны дальнейшие объяснения?

0 голосов
/ 08 марта 2010

Вы можете сопоставить поля базы данных в наборе результатов с объектом в hibernate: документация объясняет, как.

Идея Hibernate состоит в том, чтобы заполнить объектно-реляционный пробел. С помощью хранимых процедур (о которых я не могу догадаться, поскольку вы ничего о них не сказали) вы не можете получить объекты из базы данных. Вы все еще получаете строки.

Сокрытие столбцов базы данных от разработчиков звучит как плохая практика для меня. Возможно, вы хотите скрыть их от приложения, и вы добьетесь этого с помощью файла метаданных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...