# Java ORM test ## Initial assumptions - JPA is f\*\*\*ing slow, due too many layers of abstraction - NO xml and other shit-styled non-code-like sources must be needed - no additional tools to work (only boxed with technology set or none is applicable) ## Initila list of techs - [Apache Cayenne](https://github.com/apache/cayenne) - [Ebean](https://github.com/ebean-orm/ebean) - [jOOQ](https://github.com/jOOQ/jOOQ) - [speedment](https://github.com/speedment/speedment) - [ORMLite Core](https://github.com/j256/ormlite-core) - [EclipseLink](https://github.com/eclipse-ee4j/eclipselink) - [MyBatis](https://github.com/mybatis/mybatis-3) - [Querydsl](https://github.com/querydsl/querydsl) - [Hibernate](https://github.com/hibernate/hibernate-orm) (as JPA representative - zero mark) ## Initial criteria Must: - encrypted columns - no raw SQL for simple CRUD operations - support for PostgreSQL Good to see if: - support for MariaDB - support extended PostgreSQL features (including json and array) - "N+1" problem automatic solutions (as much as possible) - ability to generate raw SQL (to be executed elsewhere) - support for binary (BLOB) storage and extraction (10Mb per record max) ## Test plan - postgres version 14 & 14-alpine (test database performance baseline) - two databases (one with partitioning, one without) - tables per database - xxs _[50 records]_ - xs _[500 records]_ - s _[5000 records]_ - m _[50000 records]_ - l _[500000 records]_ - xl _[5000000 records]_ - xxl _[50000000 records]_ - each test module starts a fresh copy of database - database content is procedure-generated - random sequences must be pregenerated to be exactly same for all tests (to eliminate test-path diviations) - random sequence for each test is unique and not intersect (to eliminate postgresql optimizations) ## Requests plan - search - random get by id - find by integer equals - find by string equals - find by date equals - find by integer more X & less Y - find by float more X & less Y - find by date after X & before Y ## Documentation analysis **MyBatis** out of competitions, due to ass-whipping-xml notation.