# inheritance Companion module for the ankurm.com article on **Hibernate 7 inheritance mapping: `SINGLE_TABLE` vs `JOINED` vs `TABLE_PER_CLASS`**. One payment hierarchy (a root with card, bank-transfer and wallet subclasses, plus an order that points at the root) mapped three ways, run against plain Hibernate (no Spring) and in-memory H2, with every statement Hibernate generates captured in `output/`. ## Versions | Component | Version | Notes | |---|---|---| | Hibernate ORM | `7.4.13.Final` | latest 7.x GA on Maven Central on 2026-10-24 (`8.0.0.Beta3` is also listed; it is not GA) | | Jakarta Persistence | `3.2.0` | | | H2 | `2.4.240` | in memory, `OPTIMIZE_REUSE_RESULTS=0` (see `Db.java`) | | JUnit Jupiter / AssertJ | `6.0.3` / `3.27.7` | | | Java | `25` (Temurin 25.0.5+8) | | This module has its own `pom.xml` and does not use the Spring Boot parent of the main `hibernate-demo` project, so its Hibernate patch version differs from the one that project pins. ## Run ```bash ./scripts/run-all.sh # JUnit tests, then the timing run; regenerates everything in output/ ./scripts/bench.sh # only the timing run ``` ## Layout | Path | What it is | |---|---| | `src/main/java/com/ankurm/inheritance/single` | `Payment` hierarchy, `SINGLE_TABLE`, discriminator column, `@Check` constraint | | `src/main/java/com/ankurm/inheritance/joined` | the same hierarchy, `JOINED` | | `src/main/java/com/ankurm/inheritance/tpc` | the same hierarchy, `TABLE_PER_CLASS` (sequence ids, abstract root) | | `src/main/java/com/ankurm/inheritance/mapped` | `@MappedSuperclass` `AuditedBase` with two unrelated entities | | `src/test/java/.../Strategies.java` | the three hierarchies side by side | | `src/test/java/.../DdlTest.java` | writes `output/01-*` | | `src/test/java/.../SqlTest.java` | writes `output/02-*` | | `src/test/java/.../ContractsTest.java` | writes `output/03-contracts.txt`; also holds the two deliberately wrong mappings (`Sn*`, `TpcIdentity*`) | | `src/test/java/.../Bench.java` | writes `output/04-polymorphic-timings.txt` | ## Output | File | What it shows | |---|---| | `output/01-ddl-single-table.txt`, `01-ddl-joined.txt`, `01-ddl-table-per-class.txt`, `01-ddl-mapped-superclass.txt` | the schema Hibernate generates | | `output/02-sql-single-table.txt`, `02-sql-joined.txt`, `02-sql-table-per-class.txt` | INSERTs and SELECTs for the same four operations | | `output/03-contracts.txt` | row counts, INSERT counts, nullability, foreign keys, and the three failures | | `output/04-polymorphic-timings.txt` | indicative timings on 150,000 rows (not asserted; drift between runs) | Everything in `01`-`03` is produced by tests that assert the numbers they print.