Виступаючи як хтось, який витратив досить багато часу на роботу з JPA (Java Persistent API, в основному стандартизований API ORM для Java / J2EE / EJB), який включає Hibernate, EclipseLink, Toplink, OpenJPA та інші, я поділюсь частиною свого спостереження.
- ORM не швидкі. Вони можуть бути адекватними і більшу частину часу адекватними, але в умовах великої гучності з низькою затримкою вони ні-ні;
- У загальноприйнятих мовах програмування, таких як Java та C #, вам потрібно надзвичайно багато магії, щоб змусити їх працювати (наприклад, плетіння часу на Java, інструментарій тощо);
- Використовуючи ORM, а не віддаляючись від SQL (що, здається, є наміром), ви будете вражені, скільки часу ви витрачаєте на налаштування XML та / або анотацій / атрибутів, щоб отримати ORM для створення ефективного SQL;
- Для складних запитів насправді заміни немає. Як і в JPA, є деякі запити, які просто неможливі, які є в необробленому SQL, і коли вам доведеться використовувати необроблений SQL в JPA, це не дуже добре (C # /. Net принаймні має динамічні типи - var - яких багато приємніше, ніж масив Object);
- Під час використання ORM існує дуже багато "готів". Сюди входить ненавмисна чи несподівана поведінка, той факт, що вам потрібно створити можливість робити оновлення SQL у вашій базі даних (використовуючи refresh () у JPA або подібні методи, оскільки JPA за замовчуванням кешує все, щоб не потрапити в пряму базу даних оновлення - запуск прямих оновлень SQL - це звичайна діяльність з підтримки виробництва);
- Об'єктно-реляційна невідповідність завжди викличе проблеми. З будь-якою такою проблемою відбувається компроміс між складністю та повнотою абстракції. Часом я відчував, що СВЗ зайшов занадто далеко, і потрапив у справжній закон зменшення віддачі, коли втручання складності не було виправдане абстракцією.
Є ще одна проблема, яка потребує трохи більше пояснень.
Традиційна модель для веб-додатків полягає в тому, щоб мати стійкий рівень та рівень презентації (можливо, між ними є сервіс чи інші шари, але це два важливі для цього обговорення). ORM змушує жорсткий погляд від вашого шару стійкості до рівня презентації (тобто ваших організацій).
Одне з зауважень більш необґрунтованих методів SQL полягає в тому, що ви закінчуєте всі ці VO (об'єкти значення) або DTO (об'єкти передачі даних), які використовуються просто одним запитом. Це рекламується як перевага ORM, тому що ви позбудетесь цього.
Річ у тому, що проблеми з ORM не зникають, вони просто переходять до рівня презентації. Замість створення VO / DTO для запитів ви створюєте власні об’єкти презентації, як правило, по одному для кожного перегляду. Як це краще? ІМХО це не так.
Я писав про це в ORM або SQL: Ми там ще? .
Моя наполеглива технологія вибору (на Java) в наші дні - ibatis. Це досить тонка обгортка навколо SQL, яка робить 90% + того, що може зробити JPA (вона навіть може ледаче завантажувати відносини, хоча це не добре документально підтверджено), але з набагато меншими накладними витратами (з точки зору складності та фактичного коду).
Це з'явилося минулого року в заявці GWT, про яку я писав. Багато перекладів з EclipseLink на об'єкти презентації в реалізації послуги. Якби ми використовували ibatis, було б набагато простіше створити відповідні об’єкти за допомогою ibatis, а потім передати їх увесь шлях вгору та вниз по стеку. Деякі пуристи можуть стверджувати, що це Bad ™. Можливо, так (теоретично), але я вам кажу: це призвело б до більш простого коду, більш простого стека та більшої продуктивності.