Projections: read-only views on your data→
JPA entities are read-write, and @Immutable is a runtime convention. A Storm projection models a read-only view on the data, a table subset or a database view, built to be nested, filtered, and reused.
JPA to Storm6 min readKotlin
Upserts without the workarounds→
JPA's find-then-save pattern is two statements and one race condition. Storm generates the database's native upsert syntax: atomic, batched, and portable across all major databases.
JPA to Storm5 min readKotlin
Optimistic locking with immutable entities→
JPA checks the version at flush time, far from the code that made the change. Storm checks it on the update statement itself, and immutable values make conflict handling ordinary code.
JPA to Storm5 min readKotlin
Transactions without the proxy rules→
@Transactional works through proxies, with rules around self-invocation and visibility that fail silently. Storm's transaction blocks make the scope visible, add onCommit callbacks, and stay coroutine-aware.
JPA to Storm6 min readKotlin
Mapped collections vs queried associations→
owner.pets is one property access, and that is genuinely convenient. Storm queries the association instead: one line that loads when you decide, composes with filters and paging, and survives the join table growing columns.
JPA to Storm6 min readKotlin
Full SQL without giving up safety→
Native queries return untyped rows and invite concatenation. Storm's SQL templates bind interpolated values safely, map rows to data classes, and expand your entities into columns and joins.
JPA to Storm6 min readKotlin