{"id":"019d24cb-07d4-7dfc-a916-7996712e301e","title":"EclipseLink 5.0.0 released: the Reference JPA Implementation evolves","slug":"2026/03/eclipselink-5-0-0-released-the-reference-jpa-implementation-evolves","renderedHtml":"<p><a href=\"https://eclipse.dev/eclipselink/\" title=\"originally TopLink, EclipseLink is the reference implementation for JPA. Supports more than RDMS, as does Hibernate, and if Hibernate has a JPA competitor, you just found it. Has slightly better batching and large dataset performance than Hibernate, but if you don't know about it, learning about it's going to be fun.\">EclipseLink</a> 5.0.0 has been released, delivering <a href=\"https://jakarta.ee/specifications/persistence/\" title=\"Jakarta Persistence (JPA) is the standard Java/Jakarta EE API for object-relational mapping.\">Jakarta Persistence</a> 3.2 support as part of the Jakarta EE 11 generation.</p>\n<h2>What's new in 5.0.0</h2>\n<p>The headline is complete Jakarta Persistence 3.2 compliance, which brings a rich set of language-level improvements. Java record types are now first-class <code>@Embeddable</code> classes, a quality-of-life win that removes a persistent pain point for teams adopting records in their domain model. The temporal story gets a needed modernization: <code>java.time.Instant</code> and <code>java.time.Year</code> gain first-class mapping support, and the old <code>Calendar</code>, <code>Date</code>, <code>@Temporal</code>, and <code>TemporalType</code> APIs are formally deprecated in favor of the <code>java.time</code> API — which has been available since Java 8 and really should have been the standard path years ago.</p>\n<p>JPQL picks up <code>UNION</code>, <code>INTERSECT</code>, and <code>EXCEPT</code> (long-missing from the spec), plus <code>CAST</code>, <code>LEFT</code>, <code>RIGHT</code>, and <code>REPLACE</code>, a <code>||</code> string concatenation operator, and <code>ID()</code> and <code>VERSION()</code> functions. These aren't exotic; they're the kinds of things developers have been working around with native queries for years. If you use criteria, the Criteria API gains <code>CriteriaSelect</code>, <code>EntityType</code>-based joins, and new <code>getSingleResultOrNull()</code> - likely a welcome addition that replaces the <code>try/catch NoResultException</code> pattern. Static inner classes are now valid entity and embeddable types, and <code>PersistenceConfiguration</code> provides a programmatic path to building an EntityManagerFactory without a persistence.xml, which matters for test and embedded scenarios.</p>\n<p>On the infrastructure side: BOM artifacts are introduced for cleaner dependency management, JPMS module descriptors got fixes and cleanup (if that is something you use), deadlock detection was improved, and legacy code using <code>java.util.Vector</code> internally was cleaned out. This looks like a solid, well-scoped major release, as one might expect. Or one might not, if you're not aware of some of the less-talked about corners of the Java ecosystem: very strong but generally seen as part of monolithic deployments rather than &quot;popular tools.&quot;</p>\n<h2>EclipseLink vs. Hibernate</h2>\n<p>The two implementations share a spec but diverge in character. <a href=\"https://hibernate.org/orm/\" title=\"an object-relational mapper largely considered to be the state of the art for Java. It's a JPA implementation but sometimes the JPA implementation feels bolted-on, because it influenced JPA more than was influenced BY JPA, and it shows. Still generally the standard.\">Hibernate</a> historically drove many of the features that eventually become JPA standards. It has a large, vocal community, extensive documentation, an active blog, and deep integration with the Spring ecosystem. When you add <code>spring-boot-starter-data-jpa</code> to a project and don't otherwise configure anything, you get Hibernate. For a significant part of the Java developer community, JPA <em>is</em> Hibernate, and vice versa.</p>\n<p>EclipseLink's strength is different. It is the reference implementation of the specification, and has <em>always</em> been, thanks to its TopLink heritage. This means it tends to be more conservative, more spec-literal, and less inclined toward proprietary extensions (though it has them: <code>@AdditionalCriteria</code>, fine-grained caching controls, EIS persistence, and the MOXy XML/JAXB layer). EclipseLink tends to lean in more towards  Jakarta EE application servers more uniformly than Hibernate's more <a href=\"https://spring.io/projects/spring-framework\" title=\"a Java application framework providing a DI container and vast ecosystem of modules. Foundation for Spring Boot, Spring Security, Spring Data, Spring Integration, and more.\">Spring</a>-centric defaults, which matters in environments where a container is doing more of the lifecycle management.</p>\n<blockquote>\n<p>Lifecycle management is <strong>the</strong> lever for Jakarta EE. Most developers want end-to-end control of their application, from configuration to setup to deployment to everything, and Jakarta EE is designed to let those who're good at configuration <strong>handle configuration</strong>, the same for deployment: you declare that you need a given resource, you acquire it, you use it, you release it. Spring is <strong>able</strong> to give you this model, but it's more the &quot;traditional&quot; design: you control everything. Many developers like control, as it turns out, which is why they run everything on their local PCs - and we've changed a lot of deployment models to cater to this preference. More on this in the next section.</p>\n</blockquote>\n<p>The tradeoff, historically, is that EclipseLink's <em>community engagement</em> feels thin. Blog posts, Stack Overflow answers, and conference talks on EclipseLink are a fraction of what Hibernate generates. Version cadence and documentation updates have lagged. There's no EclipseLink equivalent of the Hibernate team's consistent stream of tutorials and upgrade guides. You can stock a library shelf with Hibernate books: for EclipseLink, it's much more slim pickings. You end up working with the JPA standard (not a bad thing) and working out what EclipseLink does differently than Hibernate more than anything else, because the documentation silently <em>assumes</em> Hibernate.</p>\n<h2>The silent majority problem</h2>\n<p>Here's what makes EclipseLink interesting as a case study, though: by the metrics we can measure - GitHub stars, Stack Overflow tags, blog posts, websites dedicated to support, conference talks -  it looks marginal. But by the metrics we can't easily measure - enterprise deployments in Oracle, IBM, and Jakarta EE-certified stacks - it's probably not marginal at all. If you're using an application server other than JBoss/Red Hat, you're likely to be using EclipseLink unless you shoehorn Hibernate in anyway.</p>\n<p>This feels a lot like the <a href=\"https://www.oracle.com/java/technologies/javaserverfaces.html\" title=\"&lt;reply&gt;JSF is JavaServer Faces, a component model for the web.\">JSF</a> situation JavaServer Faces (or, I guess, Jakarta Faces now) has had decades of vocal critics and a steady drumbeat of blog posts declaring its irrelevance, while a substantial slice of enterprise Java - insurance companies, government systems, banking back-offices - have apparently kept running it without generating any public signal. The community's apparent consensus (&quot;JSF is dead/dying/irrelevant&quot;) and the actual deployment reality diverged badly, because the people running JSF in production weren't the people writing blog posts or attending conferences. They were, characteristically, the people not talking about their stack at all. And you can see this in seeing how JSF vendors <em>still</em> have relatively regular releases - to almost no public acclaim and interaction.</p>\n<p>EclipseLink occupies a similar niche. The organizations most likely to use it are the ones running managed Jakarta EE servers - Payara, OpenLiberty, WebLogic - under enterprise software procurement processes that do not produce (or even <em>allow</em>, in many cases) blog posts. They chose EclipseLink because their vendor supports it, because their server ships with it, or because they have institutional knowledge from J2EE-era TopLink deployments. They're not going to tweet about it. (And, again, in some cases they're not <em>allowed</em> to tweet about it.) When the EclipseLink project ships the next version, they'll eventually upgrade, file a ticket if something breaks, and otherwise generate no observable signal.</p>\n<p>The question this raises is genuinely tricky for anyone trying to gauge ecosystem health: where are the talking voices, and why? In any mature technology space, the most active public voices are the ones with something to sell - training, consulting, tooling - or the ones solving genuinely novel problems. (Or sites like this one, who might hope to benefit from those talking voices.)</p>\n<p>Enterprise-stable technology running steadily in production produces little smoke like that: it's not accompanied by fury or chatter or, for that matter, constant discovery. This creates a systematic bias in how we perceive &quot;community health&quot; that's worth being explicit about. A quiet project isn't necessarily a dead project. Sometimes it's just a project that has found its users, and those users are busy running production systems rather than writing about them.</p>\n<p>And that's why we get releases like new implementations for EclipseLink and Mojarra.</p>","excerpt":"EclipseLink 5.0.0 has been released. EclipseLink is the reference implementation for Jakarta Persistence, and is the standard implementation for many application servers; this release updates some really useful features, like JPQL updates and outdating some APIs that need to be sunset.","authorId":"019c5c8a-609d-7cd4-975b-50bbcc412a33","authorDisplayName":"dreamreal","status":"APPROVED","publishedAt":"2026-03-25T11:39:43.512Z","sortOrder":0,"createdAt":"2026-03-25T11:39:38.835538Z","updatedAt":"2026-03-25T11:44:22.115907Z","commentCount":0,"tags":["eclipselink","hibernate","jpa","rdms"],"categories":[],"markdownSource":null}