# 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 - insert - single - correct data - constrain violation - batch - correct - invalids (by hand to check if full transaction will roll back) - find - by equals (1) - integer - string - date - by more X & less Y (N) - integer - float - date - update - random by id (single) - by criteria (batch) - delete - random by id (single) - by criteria (batch) ## Documentation analysis - **MyBatis** - out of competitions, due to ass-whipping-xml notation. ## Initial project setup analysis - **speedment** - cool-looking streaming API, but it's way of from common SQL-like syntax & failes to work with UUID columns corectly, also they wanna' our money, dude if we need something not straightly mapped. Out of competition. - **jOOQ** - enterprise style peace of ..., but still in. - - [Apache Cayenne](https://github.com/apache/cayenne) - [Ebean](https://github.com/ebean-orm/ebean) - [ORMLite Core](https://github.com/j256/ormlite-core) - [EclipseLink](https://github.com/eclipse-ee4j/eclipselink) - [Querydsl](https://github.com/querydsl/querydsl) - [Hibernate](https://github.com/hibernate/hibernate-orm) (as JPA representative - zero mark)