|
|
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Ну и мои ответы, конечно 1) Hibernate ускоряет разработку простых и средних приложений - Да 2) Hibernate ускоряет разработку сложных приложений - Нет 3) Не рекомендуется мешать hibernate и JDBC - Да 4) Hibernate заменяет понятие RDB на что-то типа "Persistent objetcs in DB" - Да 5) Hibernate не рекомендует использовать native SQL - Да 6) Hibernate работает медленнее, чем если реализовывать через JDBC - Да 7) Сей топик породил еще одного (как миниум) hibernato-ненависника - Да 8) ООП - панацея на все - Нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2005, 05:28 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Просто у меня появилось время и мне хочется прощупать технологию hibernate. Во время этого прощупывания соответственно появляются вопросы. 1. Сначала была база потом приложение. Стоит ли в этом случае городить огород реляционного мапинга. Понятно, что если супердизайнеры объектов спроектировали uml картинки приложения. Потом забабахали классы. Потом сгенерили таблицы в базе... естественно у них не возникнет особых несостыковок. А вот если заказчик дает тебе базу и говорит: менять структуру низя. Приходится изъ№"№нуться чтоб натянуть на нее hibernate. Или может hiberprofy натягивают hibernate на любую базу? 2. Действительно ли рекомендуется не мешать hibernate и jdbc? Если да то почему? (Для меня это очень важно, потомучто только так я могу гарантировать, что все будет работать независимо от моих граблей с хибернэйтом - вызывать session.getConnection() там где нельзя по другому и пользоваться старым добрым дждбс) Единственное что мне пока нравится - это то, что я получаю в результате выборки объекты(Не нада руками мапить резалтсет в нужные объекты). Буду благодарен за показанные преимущества hibernate. Да и не плохо было бы исключить ответы о преимуществах хибернэйт типа: "А... О... хибернайт - выбор профессионалов... подрастешь поймешь(непременно растопырив пальцы) " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2005, 15:13 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
andrushok 1) Hibernate ускоряет разработку простых и средних приложений - Да 2) Hibernate ускоряет разработку сложных приложений - Нет В книжечке, о которой я упоминал, приводятся рассуждения о не стыковке парадигм возникающей при связывании реляционных баз данных и оо кода. Там достаточно много иллюстраций в чём эта не стыковка выражается. Суть всех этих рассуждений одна: если идти на поводу баз данных - теряются все прелести ооп, если идти на поводу у ооп - теряются все приимущества от использования баз данных. Там же описаны существующие подходы к решению этой проблемы и ORM признаётся наиболее зрелым из них. Так же приводится классификация ORM cистем: Let’s look at the various ways ORM can be implemented. Mark Fussel [Fussel 1997], a researcher in the field of ORM, defined the following four levels of ORM quality. Pure relational The whole application, including the user interface, is designed around the relational model and SQL-based relational operations. This approach, despite its deficiencies for large systems, can be an excellent solution for simple applications where a low level of code reuse is tolerable. Direct SQL can be fine-tuned in every aspect, but the drawbacks, such as lack of portability and maintainability, are significant, especially in the long run. Applications in this category often make heavy use of stored procedures, shifting some of the work out of the business layer and into the database. Light object mapping Entities are represented as classes that are mapped manually to the relational tables. Hand-coded SQL/JDBC is hidden from the business logic using wellknown design patterns. This approach is extremely widespread and is successful for applications with a small number of entities, or applications with generic, metadata-driven data models. Stored procedures might have a place in this kind of application. Medium object mapping The application is designed around an object model. SQL is generated at build time using a code generation tool, or at runtime by framework code. Associations between objects are supported by the persistence mechanism, and queries may be specified using an object-oriented expression language. Objects are cached by the persistence layer. A great many ORM products and homegrown persistence layers support at least this level of functionality. It’s well suited to medium-sized applications with some complex transactions, particularly when portability between Object/relational mapping 25 different database products is important. These applications usually don’t use stored procedures. Full object mapping Full object mapping supports sophisticated object modeling: composition, inheritance, polymorphism, and “persistence by reachability.” The persistence layer implements transparent persistence; persistent classes do not inherit any special base class or have to implement a special interface. Efficient fetching strategies (lazy and eager fetching) and caching strategies are implemented transparently to the application. This level of functionality can hardly be achieved by a homegrown persistence layer—it’s equivalent to months or years of development time. A number of commercial and open source Java ORM tools have achieved this level of quality. This level meets the definition of ORM we’re using in this book. Let’s look at the problems we expect to be solved by a tool that achieves full object mapping. hibernate - ORM средство из последней категории. Выгода от его использования тем выше, чем больше требований к ORM системе предьявляет конкретное приложение. По умолчанию предполагается, что приложение построено согласно layered architecture и что hibernate будет использован в его persistent layer. Imho, - в простых приложениях использование hibernate замедлит разработку, проще грамотно спроектировать таблички, процедурки и т.д. - в средних - в зависимости от опыта работы с hibernate и общих требований к приложению (если не знать достаточно хорошо h* и торопиться, то получится заведомо хуже, чем используя голый jdbc). - в сложных - без использования hibernate или аналогичного средства просто никуда не денешься. 3) Не рекомендуется мешать hibernate и JDBC - Да sure, т.к. структура приложения должна быть максимально прозрачна и легко поддерживаема. добиться этого смешивая два разных подхода к одному и тому же - трудно. 4) Hibernate заменяет понятие RDB на что-то типа "Persistent objetcs in DB" - Да Я не нахожу смысла в этой фразе. 5) Hibernate не рекомендует использовать native SQL - Да Так же как не рекомендуется использовать native код в java приложениях. 6) Hibernate работает медленнее, чем если реализовывать через JDBC - Да В простых приложениях - да, т.к. там достаточно просто представить все таблички, связи между ними и написать эффективные запросы. В сложных - нет. Попытки ручного написания sql в этом случае сродни попыткам написания эффективного кода на ассемблере под различные процессоры. Мало того, что это оЧЧень много работы, эта работа может быть проведена в пустую. Правда это теория, на практике я никогда такую работу не делал (оптимизацию sql в сложных аpp). 7) Сей топик породил еще одного (как миниум) hibernato-ненависника - Да Как мало надо для того, что бы породить какого-нибудь ненавистника :) 8) ООП - панацея на все - Нет Не понятно зачем такой вопрос ставился. Есть области, где использование ООП даёт преимущества и есть области, где это не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2005, 18:52 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Не_Без_Нас_Грешных ... Imho, - в простых приложениях использование hibernate замедлит разработку, проще грамотно спроектировать таблички, процедурки и т.д. - в средних - в зависимости от опыта работы с hibernate и общих требований к приложению (если не знать достаточно хорошо h* и торопиться, то получится заведомо хуже, чем используя голый jdbc). - в сложных - без использования hibernate или аналогичного средства просто никуда не денешься. На Ваше Imho я имею свое. Тольки одно уточнение. Возможность спроектировать базу и написать поверх нее что-то достаточно _невилика_ в наше время. Скорее всего база уже рождена кем-то до Вас и 1) Она сама спректированна не лучшим образом (программисты, твою мать) 2) Она совершенно не отвечает тем пожеланиям, которые Вы имеете. Таки, если Вы обитаете в _академическом_ мире, то оч.удобно сопоставлять нужные пробирки, а реалный мир предпологает разгребание дерьма в производсвенных масштабах. К большому сожалению с реальным миром я имеел дело куды чаще (может, Вам и везло ...) Итого - в простых приложениях использование hibernate ускорит разработку, проще грамотно _ВСЕ_ спроектировать и _РЕАЛИЗОВАТЬ_. - в средних - в зависимости от опыта работы с hibernate и общих требований к приложению (если не знать достаточно хорошо _ЧТО-ТО_ и торопиться, то получится заведомо хуже, чем используя _ТО_ЧТО_ЗНАЕШЬ_, Hibernate в частности, так как не стоит предпологать, что это умно использовать hibernate, если с ним не знаком). - в сложных - без использования оптимизации SQL и изменения схемы базы (например, денормализация) просто никуда не денешься. Что сущейственно осложняет работу с такими промежуточными layers как hibernate. Вот така моя интерпритация. А в остальном, прекрасная маркиза, я с Вами полностью согласен, да и Вы со мной, что совсем не странно, однако. 2 Алексей Поворотный Я уже тут кое-где писал о сюрпризах hibernate, типа что save() совсем не означает, что объект записывается в базу, а load(), что он из базы прочитан. Hibernate кеширует запросы и выполняет их, только когда считает нужным. Так что надо либо довериться ему в этом (можно, его толковые ребята писали), либо ... сами знаете. Вот и не надо мешать JDBC, а то много грабель будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 07:17 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
andrushok Я уже тут кое-где писал о сюрпризах hibernate, типа что save() совсем не означает, что объект записывается в базу, а load(), что он из базы прочитан. А вы, батенька, провокатор. Как там с моим примером дела, в котором save() все записывал, а load() загружал? 1) Hibernate ускоряет разработку простых и средних приложений 2) Hibernate ускоряет разработку сложных приложений Не совсем верно, на мой взгляд, поставлен вопрос. ORM ускорит разработку любых приложений, но только если их будет вести достаточно грамотная команда разработчиков. Иначе orm не спасет ни малый, ни крупный проекты. 3) Не рекомендуется мешать hibernate и JDBC Не верно. Я, например, мешаю и, так как это все так и остается на уровне реализации моих DAO - то я никак не теряю в совместимости. 4) Hibernate заменяет понятие RDB на что-то типа "Persistent objetcs in DB" Не верно. РБД - это РБД никто не предлагает заменять их ORM. Это как двигатель рулем. 5) Hibernate не рекомендует использовать native SQL Тоже неверно. Т.е. вы не совсем верно понимаете рекомендации hibernate team. Они не рекомендуют его использование для реализации object querying'а для самого hibernate. т.е. если хотите использовать те же хранимые процедуры я бы лучше стал мешать hibernate и jdbc. 6) Hibernate работает медленнее, чем если реализовывать через JDBC Лучше документацию по Hibernate прочесть - там об этом неплохо написано. 7) Сей топик породил еще одного (как миниум) hibernato - ненавистника По-моему сей топик не тянет даже на средний уровень. так что кого и когда он породил мне не ясно. 8) ООП - панацея на все Сложный вопрос. Вы, я так понимаю, противопоставляете ООП и ER-моделирование РБД? Это в общем не верно. Почему? Это другой вопрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 11:21 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Фуников Юрий Я уже тут кое-где писал о сюрпризах hibernate, типа что save() совсем не означает, что объект записывается в базу, а load(), что он из базы прочитан. А вы, батенька, провокатор. Как там с моим примером дела, в котором save() все записывал, а load() загружал? А вы батенька, американский шпиен, однако! Таки не колитесь. С примером усе впорядке - я помоему описал мою работу с ним. Вы читали? Я не знаю... Можно былоб пару сточек хотя бы чиркнуть ... Там кой-каки грабли, кстати описаны (я могу, конечно опять ошибаться, человек, однако). Ну дык к нашим баранам 1) save() ничего не кладет в базу, а кеширует SQL запросы. Они выполняются при вызове commit() 2) load() ничего не грузит из базы, к базе идет запрос тольки при первом вызове какого-нить get...() Эти утверждения верны или нет? Если верны - ТРЕБУЮ ИЗВИНЕНИЙ ЗА ПРОВОКАТОРА! (шутка =)). Если нет - зарание сам извиняюсь - мол, провокатор таки, бес попутал (тоже шутка =)). Ну а что грамотная команда разработку (любую!) сделает лучше, я согласен. Да и кажный согласиться. А вот средненька команда (опять реалии жисти, однако) дров может с hibernate наломать, что потом и не расхлебаешь. Да еще при условии, что база дана _как_есть_. Так что дорогой Вы наш, учитывая все наши оговорки, мы говорим об одном и том-же, тольки в силу нашей личной специфики кажный выпячивает то, что ему выгодно и скрывает, что не выгодно. Нормальное поведение. Ну и про RDB и OOP. Опять таки вопросики ... 1) Если я использую JDBC - я работаю с понятиями RDB (record, field, recordset ...) 2) Если я использую Hibernate - я работаю с понятиями OOP (object, hierarchy, deriving ...) 3) Eсли я пользую и то и другое - я вынужден мешать эти понятия. Я думаю здесь все согласны, что ответ "ДА". А вот хорошо ли мешать то и другое, вопрос более сложный и мы опять вернулись в область оговорок - квалификация команды. При отличной команде это фиолетово - толковые ребята во всем разберуться. При средней будет много головной боли. Я уже говорил - меня щас волнует _практицкое_ использование сего продукта, поэтому я и придираюсь к нему. А _тетеретицки_ все очень классно, что в описаниях (которые Вы мне советуете постоянно почитать) показано. Я уже и эту книжку "Hibernate in Action" прикупил, написанную кстати авторами сего продукта. Там тоже много лестных слов они о себе написали. Основеная проблема (для меня, ессесвенно) это то что ребята из hibernate мыслят совсем иначе, чем я. И если они считают, что hibernate генерить достаточно оптимальй коде - я с ними не согласен. Оптимизировать базу на уровне SQL запросов (хранимых процедур в частности) можно лучше. Imho. Но написать достаточно хорошо работающее приложение быстро - это вопрос. На который я пока для себя точноного ответа не получил, однако ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 18:30 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Вы читали? Я не знаю... Можно былоб пару сточек хотя бы чиркнуть ... Черкну сейчас авторОни как раз решили наоборот и постепенно развивают продукт в этом направлении Это верная. Первая тоже верная, но я имел в виду что в том виде в котором поддержка SP реализована сейчас их использование для CRUD-операций не целесообразно. ... Integer id = Integer( 2); Cat cc = session.load( Cat.class, id); ... // где-то выполнили SQL напрямую и удалили из базы кота с ID = 2 ... cc.setName( cc.getName() + '!'); // Таки здесь получили ошибку, так как // кот cc начал грузиться из базы тольки на cc.getName(); session.save( cc); Да произойдет ошибка и транзакция откатится. Это нормальное поведение. Тут можно много интересного написать про pessimistic и optimistic locking strategy, но конкретно для этого примера прежде всего стоит сказать что он концептуально не верен. Т.е. налицо ошибка в алгоритме. А так из-за того что все действия проходят в одной транзакции мешать код (sql и hql) можно и иногда нужно. Я имел ввиду не использовать insert/update/delete напрямую (сие работает!) а SP вместо них. И я тоже имел в виду именно это :) практически в кажный SQL может быть необходимость что-то добавить. Или я чего-то не понимаю или ... Т.е. хочется пример задачи где в каждый запрос с клиента нужно чего-то добавлять! (ну во view это все заверните ?) Да и кажный согласиться. А вот средненька команда (опять реалии жисти, однако) дров может с hibernate наломать, что потом и не расхлебаешь. Согласен. Но Imho такую команду лучше к проектам не подпускать. Пусть не все, но ведущие позиции должны занимать знающие люди. Они вместе с code review должны будут выявлять неверные подходы у менее опытных товарищей. Но это уже больше не ко мне а к тем кто занят управлением проектами. Я думаю здесь все согласны, что ответ "ДА". А вот хорошо ли мешать то и другое, вопрос более сложный и мы опять вернулись в область оговорок - квалификация команды. Тоже согласен. Но это “мешание” будет изолированно в DAL'е и без него пока так или иначе никуда. Все равно с простыми recordset'ами ничего серьезного не сделаешь. 1) save() ничего не кладет в базу, а кеширует SQL запросы. Они выполняются при вызове commit() 2) load() ничего не грузит из базы, к базе идет запрос только при первом вызове какого-нить get...() Первое верно, второе зависит от вида locking strategy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 19:33 |
|
||
|
Что делать если у меня нет первичного ключа в базе , а hibernate требует его явно писать.
|
|||
|---|---|---|---|
|
#18+
Ну вот, дык обо всем договориться можно. Вот тольки с командой беда, манагеры, сволочи, хотять подешевле, так имеем, что имеем ... Но это уже из другой оперы, офф топ, однако. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 20:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33080962&tid=2152339]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 350ms |

| 0 / 0 |
