|
|
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
ActiveJDBC - лайтвейт реализация паттерна ActiveRecord, http://code.google.com/p/activejdbc. Если кратко в чем преимущества и недостатки - очень легко ложится когда структура базы не очень сложная и контролируется разработчиком, так как основан на convention over configuration, нет никаких персистенс контекстов, сессий и т.д. настройка минимальна. поддерживает кэшинг, асооциации, лейзи лоадинг, листенеры и кучу всего. Очень легко тестируется Из минусов - есть зависимости от классов фреймворка(не true POJO), что как по мне не так уж и критично. Главный минус - на этапе сборки необходима инструментация, но она легко настраивается, но так как классы инструментированы работа при дебаге и из IDE немного затруднена, работаем над этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 16:15 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
А и еще не поддерживает JPA, кому-то возможно это будет существенным минусом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 16:16 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPetro123про topLink немного критики, когда сам искал: Они все в той или иной степени глючные. Говорят topLink быстрее чем хибернейт на оракле. Правда? про скорость не слышал. Очень уж трудный критерий для данного класса ПО. Ложек дёгтя больше про него слышал чем про другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 16:27 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
BlazkowiczГоворят topLink быстрее чем хибернейт на оракле. Правда?нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 16:28 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
Добрый день, забыл ник! > http://code.google.com/p/activejdbc. > Главный минус - на этапе сборки > необходима инструментация, но она легко настраивается, но так как классы > инструментированы работа при дебаге и из IDE немного затруднена, > работаем над этим. Ну по мне, так инструментация при загрузке (хибер) точно не лучше :) А как это применимо к разработке JavaEE? 1. Вообще возможна работа внутри Stateless? 2. Запуск клиента на машине разработчика обычно происходит из eclipse без мавена, т.е. инструментации на клиенте не будет. Но все запросы только с AS, т.е. там будет. Это нормально? 3. Что будет, если я пытаюсь получить LAZY на клиенте, т.е. вне сессии? Можно ли вешать некий листинер, который при этом будет вызывать обращение к AS и получение необходимых данных? Пример - есть "клиент" у него "адрес" у адреса "улица", "город", "ПО", ещё всякая фигня. Хочется, с одной стороны, обойтись загрузкой адреса, с другой- получать что нужно без проблем. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 17:14 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
тут немного другая инструментация, хибер создает прокси, тогда как ActiveJDBC, добавляет методы в основном статические прямо в класс модели, поэтому когда открываешь из эклипса файл мождели - то он пишет что сорс нот фаунд, но если открыть класс модели через ctrl_shift+r то его сорсы ты увидишь, брейкпоинты тоже ставить, в общем недостаток, но не критичный. Жить можно. Зачем добавляются статические методы? Чтобы можно было делать вещи вроде Person.findById() и т.д.. 1. Вообще возможна работа внутри Stateless? - не совсем понял, поясните плиз. 2. Запуск клиента на машине разработчика обычно происходит из eclipse без мавена, т.е. инструментации на клиенте не будет. Но все запросы только с AS, т.е. там будет. Это нормально? - Опять не совсем понял, обьясняю, что клиент что сервер будут зависеть от какой-то либы с классами модели, эта либа получается при сборке после фазы инструментации, таким образом она видна будет что там, что там, я ответил на вопрос? 3. Что будет, если я пытаюсь получить LAZY на клиенте, т.е. вне сессии? Можно ли вешать некий листинер, который при этом будет вызывать обращение к AS и получение необходимых данных? Пример - есть "клиент" у него "адрес" у адреса "улица", "город", "ПО", ещё всякая фигня. Хочется, с одной стороны, обойтись загрузкой адреса, с другой- получать что нужно без проблем.----------- AJ вообще не закрывает сессию, на пальцах как это работает - ты создаешь фильтр, в начале реквеста вызываешь DB.getConnection() и она автоматом ложится в ThreadLocal, при любом запросе любого метода модели, коннекшн берется из ThreadLocal transparent. В конце запроса коннекшн из тредлокал изымается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 17:46 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
брейкпоинты ставить можно, а то я немного сумбурно описал. Просто когда дебажишь когда доходит до класса модели - показывает типа сорс файла нет, а на самом деле ты его можешь открыть и смотреть че там внутри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 17:48 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
Добрый день, забыл ник! > 1. Вообще возможна работа внутри Stateless? - не совсем понял, поясните > плиз. Я просто не знаю- может есть какие-то камни подводные. > я ответил на вопрос? Примерно. > AJ вообще не закрывает сессию, Ещё раз. На AS получил объект. Передал его через RMI на клиента. Там попросил данные, которые LAZY. Что будет? EJB2, насколько я знаю древности, дозапросит данные, но оракловые админы хотели запиннать того, кто это придумал. EJB3 просто пошлёт нафиг. Что сделается тут? -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 18:22 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
авторЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там попросил данные, которые LAZY. Что будет? EJB2, насколько я знаю древности, дозапросит данные, но оракловые админы хотели запиннать того, кто это придумал. EJB3 просто пошлёт нафиг. Что сделается тут? Понял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 19:10 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там попросил данные, которые LAZY. Что будет?Давайте начнем с того, что мы никак не можем передать через RMI клиенту неинициализированное поле. Просто напросто потому, что оно несериализуемо. А если бы оно и было сериализуемо, то клиент все равно не смог бы его десериализовать, ибо на месте неинициализированных полей стоят прокси, чей байт-код формируется в runtime-е. Как быть в этом случае? А в этом случае надо вспоминать про J2EE паттерны, в частности про Data Transfer Object. забыл никПонял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать.Это неправда. Какой коннекшн? В каком треад-локале? На клиенте нет ни того, ни другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 19:42 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никПонял, класс будет искать коннекшн в треадлокале и обломится. Вообще очень интересный поинт, раньше рассматривал только в контексте веб-приложений, надо будет подумать.Это неправда. Какой коннекшн? В каком треад-локале? На клиенте нет ни того, ни другого.[/quot] так именно потому и обломится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 19:46 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
svenomGKS_SamaraЕщё раз. На AS получил объект. Передал его через RMI на клиента. Там попросил данные, которые LAZY. Что будет?Давайте начнем с того, что мы никак не можем передать через RMI клиенту неинициализированное поле. Просто напросто потому, что оно несериализуемо. А если бы оно и было сериализуемо, то клиент все равно не смог бы его десериализовать, ибо на месте неинициализированных полей стоят прокси, чей байт-код формируется в runtime-е. Как быть в этом случае? А в этом случае надо вспоминать про J2EE паттерны, в частности про Data Transfer Object. Мы не про Хибернейт сейчас кстати. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 19:49 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никМы не про Хибернейт сейчас кстати.Ок, а про что? Вы думаете другие ORM-фреймфорки как-то принципиально иначе работают с LAZY-зависимостями? Что бы она инициализировалась на лету, прозрачно для программиста, всегда необходимо иметь на ее месте некую заглушку. При нормальном проектировании, клиент ничего про эти заглушки знать не должен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 20:06 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никтак именно потому и обломитсяГде именно обломится? И что за ThreadLocal и Connection вы имеете ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 20:10 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
svenomзабыл никМы не про Хибернейт сейчас кстати.Ок, а про что? Вы думаете другие ORM-фреймфорки как-то принципиально иначе работают с LAZY-зависимостями? Что бы она инициализировалась на лету, прозрачно для программиста, всегда необходимо иметь на ее месте некую заглушку. При нормальном проектировании, клиент ничего про эти заглушки знать не должен. Естественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя. А про что речь, как бы изначально нужно знать прежде чем писать ответы:) Выше по топику посмотри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 20:32 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никЕстественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя.Ну во-первых, то, что вы описали, это уже и есть прокси. Во-вторых, вы привели случай One-To-Many, когда у нас есть неинициализированный список. А вот что делать, если у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись. В-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования. Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 20:43 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
svenomзабыл никЕстественно нужна заглушка, но не факт что это будет прокси да еще с байт-кодом сгенеренным в рантайм. В данном случае это наследник AbstractList, который на каждый метод проверяет инициализирован ли он и если нет, то пытается получить коннекшн и загрузить себя.Ну во-первых, то, что вы описали, это уже и есть прокси. Во-вторых, вы привели случай One-To-Many, когда у нас есть неинициализированный список. А вот что делать, если у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись. В-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования. Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности. Насчет прокси я не так выразился, да естественно это будет паттерн прокси, я неправильно вас понял, я думал имеются ввиду сгенерированные классы Proxy, которые находятся в java.lang.reflect. Ну это так, к слову. Я согласен что нужна заглушка, сойдемся на этом. А вот насчет - авторесли у меня *-To-One отношение? Тут уже надо наследоваться от типа конкретного члена класса, и это вам ответ на вопрос, почему без байт-кода в рантайме не обойтись. Зачем наследоваться? можно на момент инициализации орм узнать реальный тип parent, сохранить его в метаданных, в момент вызова getParent() проверять isInitialized, и если нет - то запрашивать у БД и возвращать приведя к типу сохраненному в метаданных. Зачем рантайм байт код? авторВ-третьих, если даже такую хренотень удалось сериализовать и десериализовать, то клиент получает опасный код, который может завалить его приложение, что является грубейшей ошибкой проектирования. Вывод: на удаленного клиента никогда и ни при каких условиях не передаются неинициализированные сущности. Тут не спорю. Просто интересно стало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 21:05 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
забыл никЗачем наследоваться? можно на момент инициализации орм узнать реальный тип parent, сохранить его в метаданных, в момент вызова getParent() проверять isInitialized, и если нет - то запрашивать у БД и возвращать приведя к типу сохраненному в метаданных. Зачем рантайм байт код? Ок, вот у нас ентити: Код: java 1. 2. 3. 4. 5. 6. И вот у нас ентити: Код: java 1. 2. 3. 4. 5. 6. Департамент загружается лениво. Теперь задача такова - нам надо, когда инстанс Employee окажется на клиенте, чтобы вызов метода getDepartment() привел к подгрузке департамента (допустим, что это возможно). Как нам этого добиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 21:16 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
Да давайте для просто вообще выкинем удаленного клиента, все происходит в рамках одной JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 21:17 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
Да легко. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. Ну естественно это для одного JVM, для разных нет смысла, соглашусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 21:57 |
|
||
|
[ ORM ] Альтернатива Hibernate
|
|||
|---|---|---|---|
|
#18+
Не, это никуда не годиться. Два главных минуса: 1) Вы лишили пользователя вашей библиотеки возможности реализовывать наследование. То есть, вот с таким случаем ваша реализация не справиться: Код: java 1. 2. 3. 2) Второй минус - вы намертво привязали сущности к вашей библиотеке. Ежели вдруг решили перейти на другой ORM - пиши пропало. Возвращаясь к варианту с Employee и Department, я вижу 3 варианта решения: 1) Оборачиваем Employee в прокси через bytecode instrumentation - на лету экстендим прокси от Employee. оверрайдим getDepartment(). 2) Оборачиваем Department в прокси через bytecode instrumentation - на лету экстендим прокси от Department, оверрайдим все геттеры/сеттеры, чтобы при обращении к неинициализированному объекту, они вытаскивали его из базы. Так работает хибер. 3) Вариант без игр с байт-кодом. При сборке проекта прогоняем наши сущности через какую-нибудь утилиту, которая обернет их в прокси. Так, например, работает JiBX (хоть это и не ORM, а средство генерации классов из WSDL/XSD, но идея та же). На выходе имеем джарник, в котором вроде бы лежат наши классы, но по факту там еще куча всего нового добавлено. Главная беда такого подхода - неудобно распространять. То есть высылать такую либу какому-нибудь стороннему клиенту - это, все равно, что плюнуть ему в лицо - вместо тупой работы с get/set, ему придется еще париться об отлове всяких интересных исключений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2011, 22:15 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37568251&tid=2127815]: |
0ms |
get settings: |
12ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
207ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 552ms |

| 0 / 0 |
