Home > Back-end >  Using Hibernate 6 with JPA
Using Hibernate 6 with JPA

Time:08-29

Based on new information, I am rephrasing my question, keeping the original text below for reference:

When switching to Hibernate 6, I got requirements for new packages to include. I do not understand why those packages are needed, so I need further information what they do. Doing a search on Google or Stack Overflow mostly ends with "just add the package".

Remaining Question:

  • Why is hibernate-validator needed in Hibernate 6, but not in Hibernate 5?

Solved Questions (I will add the answers below):

  • Why is hibernate-core-jakarta needed instead of hibernate-core?
  • Why is jakarta.el-api needed?

Original Text:

I am using functionality as specified by JPA with Hibernate as implementation. Thus, I am including jakarta.persistence-api and jakarta.validation-api, as well as the required Hibernate packages.

Up to version 5.6.10, including hibernate-core-jakarta seemed to be the right thing to do. Using that package, everything worked out-of-the-box.

I have now switched to Hibernate 6.1.2. Here, hibernate-core-jakarta does not exist anymore. Thus, I am including hibernate-core now. Based on error messages I got, I also added hibernate-validator 7.0.5.Final and jakarta.el-api 5.0.1.

Now, things seem to work. Still, I am wondering: Why was hibernate-core-jakarta removed? Is the solution I found the correct one, or is there a hidden problem now?

Edit: based on some more things I read I can probably better phrase what is puzzling me:

  • As far as I know, Hibernate was originally a library independent of JPA. Then it was adapted to implement the JPA standard. (Please correct me if I am wrong.)
  • I thought using the hibernate-core-jakarta package was the equivalent to "use JPA compatibility" and hibernate-core was the equivalent to "use only Hibernate".
  • Now I think that maybe hibernate-core-jakarta meant "use JPA from Jakarta" and hibernate-core meant "use old JPA from Java EE" (javax).
  • This, of course means that now Java EE is no longer supported and thus hibernate-core inherited the functionality from hibernate-core-jakarta!?
  • However, if that is true, why did I start needing additional libraries when moving on to the new version?

CodePudding user response:

I am starting this answer to sum up partial answers I got and will mark it as solution once everything is clear. Please comment if you find mistakes, I will edit accordingly.

Why is hibernate-core-jakarta needed instead of hibernate-core?

Hibernate 5 is still written using Java Persistence API from Java EE (javax.*). There is an alternative already using Jakarta Persistence API (jakarta.*). I used this alternative because I already used Jakarta.

Hibernate 6 made Jakarta the default, so the new hibernate-core is the direct successor of hibernate-core-jakarta and the old hibernate-core is discontinued.

Why is jakarta.el-api needed?

I have been switching between Unit tests and the growing application in an unorganized way. jakarta.el-api is needed when Hibernate is used in Unit tests. Thus, I sometimes needed it, sometimes I did not. Moreover, it is not enough. You also need an implementation for the API. Choosing the right implementation is based on your project. here is a great overview.

Apparently, you can also disable this part of the code. However, the answer still relies on the javax version, and I could not reproduce it.

CodePudding user response:

You can look/debug into org.hibernate.cfg.beanvalidation.BeanValidationIntegrator to understand why bean validation was activated for your application and hence requires an implementation to be available. Usually, the implementation is only required when the API is available on the class path, so if you don't want to use jakarta.validation, just make sure it's not part of your dependencies.

jakarta.el-api is then a transitive requirement of jakarta.validation, so it seems the root of your issue is that you somehow have a dependency on the validation api.

  • Related