ST
/ORM
Kotlin 2.0–2.4 · Java 21+ · Apache 2.0
Tutorials
Examples
Blog
Docs
GitHub
Get started
Ideas behind
the framework.
Design decisions, deep dives, and the reasoning that shapes ST/ORM.
Origin
1
Design
3
Hibernate
2
SQL
1
Internals
2
Comparison
1
Opinion
1
//
Articles
Why ST/ORM is built the way it is, and what that means for the code you write.
Why we built ST/ORM
→
We used JPA and Hibernate for years and mostly liked them. This is the quieter reason we built a different ORM anyway: 300 tables, and managed entities you cannot pass around without ceremony.
September 2, 2025
Origin
A first-principles approach to your data layer
→
The most concise way to describe a table turns out to be the ultimate carrier of your data, and the contract for querying the entire relation graph. Simplicity is the ultimate sophistication.
September 30, 2025
Design
Entities are just data
→
An entity in ST/ORM is a plain record: a value with no session and no hidden state. Here is what that buys you across your application, without giving up dirty checking or lazy loading.
October 28, 2025
Design
LazyInitializationException, and what it's telling you
→
The most-googled Hibernate error is not a bug in your code. It is a lazy promise coming due after the session closed, and value entities cannot throw it.
November 25, 2025
Hibernate
The N+1 problem, and loading you can see
→
You do not fix N+1 by remembering a fetch clause. You fix it by making loading a decision the code shows you, and one you can assert in a test.
December 16, 2025
Hibernate
Stop hiding my SQL
→
SQL is the one interface every database and every backend engineer already shares. Type it and keep it in view, do not replace it with a second query language.
January 20, 2026
SQL
Three abstractions and nothing else
→
Entity, Repository, SQL Template. A model you can hold in your head is a model that does not surprise you.
February 17, 2026
Design
The static metamodel
→
Every entity gets a companion generated at compile time. It makes column and path references type-checked, and it lets queries and hydration run on generated code instead of reflection.
March 3, 2026
Internals
Dirty checking without proxies
→
You do not need bytecode enhancement or a session-bound proxy to write only the columns that changed. You need the value before and the value after.
March 17, 2026
Internals
Why we didn't choose Exposed
→
We build in Kotlin, so why not build ST/ORM on JetBrains Exposed? Exposed is excellent at modeling a database. ST/ORM draws the boundary differently: the model stays in the database, and application code gets plain, typed records.
April 14, 2026
Comparison
Why shouldn't we use an ORM?
→
The strongest arguments against ORMs are really arguments against ORMs that hide SQL. Take the concealment away and most of the case dissolves.
June 9, 2026
Opinion