prep 6.0 Final announcement
This commit is contained in:
parent
2e9b34fc51
commit
a8d9d4e5ef
|
@ -0,0 +1,137 @@
|
|||
= Hibernate 6.0 is Coming
|
||||
Steve Ebersole
|
||||
:awestruct-tags: ["Hibernate ORM"]
|
||||
:awestruct-layout: blog-post
|
||||
:docs-url: https://docs.jboss.org/hibernate/orm/6.0
|
||||
:migration-guide-url: {docs-url}/migration-guide/migration-guide.html
|
||||
:user-guide-url: {docs-url}/userguide/html_single/Hibernate_User_Guide.html
|
||||
:jakarta-transformer-url: https://github.com/eclipse/transformer
|
||||
|
||||
As Hibernate ORM 6.0 approaches Final, I wanted to take a moment to look back at its origins and
|
||||
driving forces; and to give insight into why certain choices were made.
|
||||
|
||||
This post will be followed by a series of more focused posts targeting specific improvements or
|
||||
cool new features.
|
||||
|
||||
|
||||
[[api-spi]]
|
||||
== APIs and SPIs
|
||||
|
||||
While many things have changed in 6.0, we strove to minimize changes to APIs to help
|
||||
mitigate migration costs.
|
||||
|
||||
[NOTE]
|
||||
====
|
||||
See https://hibernate.org/community/compatibility-policy/ for a discussion of what we consider
|
||||
an API versus an SPI.
|
||||
====
|
||||
|
||||
Applications which use only the Jakarta Persistence APIs will be "source compatible" within the
|
||||
discussion in <<jpa>>.
|
||||
|
||||
Applications using Hibernate APIs will generally be bytecode and source compatible, aside
|
||||
from the removal of deprecated stuff. There are a few one-off changes that break bytecode and/or
|
||||
source compatibility; these are covered in the <<{migration-guide-url},migration guide>>.
|
||||
|
||||
Quite a few SPI changes have changed to support many of the topics discussed here as well as in
|
||||
the <<{migration-guide-url},migration guide>>. Many will also be the subject of the mentioned
|
||||
follow-up posts.
|
||||
|
||||
|
||||
[[jpa]]
|
||||
== Jakarta Persistence
|
||||
|
||||
Java Persistence has become Jakarta Persistence as part of the overall move of Java EE
|
||||
to Jakarta. Various legal requirements forced the changing of the `javax` namespace -
|
||||
for persistence, that means changing from `javax.persistence` to `jakarta.persistence`
|
||||
for package names as well as property and hint names.
|
||||
|
||||
This is clearly an unfortunate and invasive change, but beyond our control. Luckily Jakarta
|
||||
have developed a <<{jakarta-transformer-url},transformer>> to help with these migrations. We actually
|
||||
used this tool to migrate Hibernate's own source code. It works well-ish.
|
||||
|
||||
For those using Maven, you are in luck (well, within the bounds of actually using Maven) in that
|
||||
Jakarta themselves provide a Maven plugin to integrate this transformer.
|
||||
|
||||
For those using Gradle, you can use the tasks we developed to transform Hibernate's source code.
|
||||
|
||||
There is also a command-line form. See the <<{jakarta-transformer-url},transformer>> docs for details.
|
||||
|
||||
|
||||
[[read-by-position]]
|
||||
== Read-by-position
|
||||
|
||||
A few years ago, around the 5.4 timeframe, we worked with the amazing performance team at Red Hat
|
||||
to squeeze even more great performance out of Hibernate ORM.
|
||||
|
||||
This work was part of a larger effort to improve the performance of WildFly. Ultimately, the limiting
|
||||
factor to additional improvements within Hibernate was our approach of reading values from a JDBC
|
||||
`ResultSet` by name rather than by position. For every JDBC driver out there, reading by name is slower.
|
||||
|
||||
It quickly became obvious that minimal changes would not be enough, and so this work led to many changes.
|
||||
A great analogy is to consider migrating a Map-based solution to List-based. There is the obvious impact
|
||||
of changing calls to accept an `int` rather than a `String` as well as internally keeping track of the
|
||||
positions of each selected value within the `ResultSet`. There is also the perhaps not-so-obvious
|
||||
impact of changing the callers and consumers of those contracts to keep track of positions.
|
||||
|
||||
These changes have led to improvements on a number of fronts:
|
||||
|
||||
1. As mentioned, reading by position is significantly faster than reading by name which leads to
|
||||
performance improvements.
|
||||
2. Historically Hibernate generated SQL select queries with a defined pattern of named column aliases
|
||||
which were later used to access the specific result. We've all seen these "ugly" aliases. With these
|
||||
changes, those select-clause aliases are no longer needed resulting in much more readable generated
|
||||
SQL.
|
||||
3. Although we implemented some improved support for limiting needed joins within an entity mapping
|
||||
(joined inheritance, secondary tables) in 5.x, 6.0 allows even better opportunity for this.
|
||||
4. (2) and (3) combined results in much smaller SQL needing to be sent to the server which can
|
||||
have an impact on network communication. Every bit helps.
|
||||
|
||||
This was by far the biggest force behind 6.0 initially.
|
||||
|
||||
|
||||
|
||||
[[mapping-model]]
|
||||
== Mapping Model
|
||||
|
||||
- Object-oriented
|
||||
- More user-friendly
|
||||
- Attribute order
|
||||
|
||||
|
||||
[[width-first]]
|
||||
== Width-first fetching
|
||||
|
||||
- examples mainly
|
||||
|
||||
|
||||
[[annotations]]
|
||||
== Annotations
|
||||
|
||||
- type-safety
|
||||
|
||||
|
||||
[[hql]]
|
||||
== HQL
|
||||
|
||||
- poor and unmaintainable grammars
|
||||
|
||||
|
||||
[[criteria]]
|
||||
== Criteria
|
||||
|
||||
- removal of legacy Criteria
|
||||
- no longer Criteria -> HQL -> Query
|
||||
|
||||
|
||||
[[sql-ast]]
|
||||
== SQL as AST
|
||||
|
||||
mention Dialect involvement
|
||||
|
||||
|
||||
[[dialect-init]]
|
||||
== Dialect initialization
|
||||
|
||||
- `Dialect` constructor
|
||||
- `Dialect#initializeFunctionRegistry`
|
Loading…
Reference in New Issue