Доброго времени. Боли и недоумевания тред.
На проекте на работе (5-й год разрабатываем говн интернет банк для очень большого и известного, но не зеленого банка). Для доступа к БД используем Apache Cayenne. Того же поля ягода, что и MyBatis. Сначала я не понимал концепта, но теперь почти счастлив. Оно умеет в native SQL через шаблонизатор перед исполнением. Няшка. Но черт побери, я хочу поддержку управления транзакциями на тех же человеческих аннотациях, JTA хочу, а такой возможности нет.
Понадобилось написать очередной эмулятор очередной системы, с которой интегрируемся - решил попробовать хибернейт, и обомлел. Оно генерит километровые left join'ы. Перед insert'ом связываю наполняемую сущность через reference с ещё несколькими сущностями, а перед тем, как заперсиститься, он делает N селектов, где N - количество связанных сущностей, чтобы проверить, что связи верны. Судя по логам, селектит таки все поля, что не лениво инициализируются. И слава б-гу у этих сущностей все тяжелые поля LAZY, а если бы нет? Почему просто id не заселектить? Почему не попытаться просто в БД положить, ну пусть уже она ругается. OpenJPA - вовсе обрубок по ощущуениям, после хибернейта. Подозреваю, что TopLink и EclipseLink трогать и вовсе смысла нет. JDBC? Слишком низкий уровень, динамически запросы не повыстраивать, а очень хотелось бы. Ну не строки же конкатенировать, да ещё билдеры под это писать. JdbcTemplate спринговый таки манит удобным управлением транзакциями, но таки jdbc остается jdbc, никакой динамики в селектах. Вот, разве что, ещё на JOOQ стоит посмотреть (оно ещё шевелится?).
Хочу поинтересоваться у местных яверов - какие ORM используете вы (на работе/в собственных проектах)? Не используете ORM? Почему?
// P.S.: Уютненький, вот, на спринге с JdbcTemplate писан. Выглядит очень лаконично, работает быстро. Но таки будь выборки позабористее, не факт, что был бы jdbc, думается.
Upd
Читал в мануале на сайте хибернейта про паттерны работы с тразнакциями, но мне интересно вот что. В рамках приложения, как далеко из DAO уходят Entity? На выходе из DAO слоя по вашему мнению должны возвращаться именно Entity? По-моему логично возвращать их, чтобы в неком «сервисном слое» можно было пробрасывать транзакции без лишних аттачей/деттачей. Один сеньор со своим чувством прекрасного склонен считать, что на выходе из DAO сразу стоит конвертить Entity в dto. Получается 100500 конвертеров, что по моему мнению сран ад какой-то. И библиотеки для ремаппинга тут не очень-то спасают, ибо всё-равно ад и тормоза.