The primary goal of the Hibernate Hydrate project is to populate a graph of persistent entities and thus avoid the famous LazyInitializationException.
- Utility class to populate a lazy-initialized object graph by recursivity
- Supports JPA with Hibernate as provider
- Supports Hibernate 3.x to 6.x (with different artefactId)
This readme file as well as the wiki are the best places to start learning about Hibernate Hydrate. There are also unit tests available to look at.
The wiki contains links to basic project information such as source code, jenkins build, javadocs, issue tracking, etc.
A French article titled Say goodbye to LazyInitializationException : http://javaetmoi.com/2012/03/hibernate-dites-adieu-aux-lazy-initialization-exception/
Download the jar though Maven:
<!-- Either Hibernate 6.1.6 and above support -->
<dependency>
<groupId>com.javaetmoi.core</groupId>
<artifactId>javaetmoi-hibernate6-hydrate</artifactId>
<version>6.3.4</version>
</dependency>
<!-- or Hibernate 5.2 and above support -->
<dependency>
<groupId>com.javaetmoi.core</groupId>
<artifactId>javaetmoi-hibernate5-hydrate</artifactId>
<version>5.2.3</version>
</dependency>
<!-- or Hibernate 5.0 and 5.1 support -->
<dependency>
<groupId>com.javaetmoi.core</groupId>
<artifactId>javaetmoi-hibernate5-hydrate</artifactId>
<version>2.3</version>
</dependency>
<!-- or Hibernate 4 support -->
<dependency>
<groupId>com.javaetmoi.core</groupId>
<artifactId>javaetmoi-hibernate4-hydrate</artifactId>
<version>2.2</version>
</dependency>
<!-- or Hibernate 3 support -->
<dependency>
<groupId>com.javaetmoi.core</groupId>
<artifactId>javaetmoi-hibernate3-hydrate</artifactId>
<version>2.2</version>
</dependency>
Please note that we are not able to support Hibernate versions 6.0 up to 6.1.5 due to bugs in them.
Hibernate Hydrate artefacts are available from Maven Central
First get a Hydrator
instance. There are four possible ways:
Hydrator.hydrator(entityManagerFactory)
Hydrator.hydrator(entityManager)
Hydrator.hydrator(sessionFactory)
Hydrator.hydrator(session)
To this Hydrator
instance you can pass attached entities that need to be fully initialized.
Afterward you can detach these entities and access all of their transitive attributes
without getting problems with lazy loading. That is, there will be no LazyInitializationException
.
A simple example of a service method that returns a fully initialized entity
except for its mySubEntities
attribute:
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import com.javaetmoi.core.persistence.hibernate.Hydrator;
import static com.javaetmoi.core.persistence.hibernate.Hydrator.hydrator;
public class MyEntityService {
private final EntityManager entityManager;
private final Hydrator hydrator;
public MyEntityService(EntityManager entityManager) {
this.entityManager = entityManager;
this.hydrator = hydrator(entityManager).withExclude(MyEntity.class, "mySubEntities");
}
@Transactional
public MyEntity myEntity(long id) {
var myEntity = entityManager.find(MyEntity.class, id);
var myHydratedEntity = hydrator.deepHydrate(myEntity);
return myHydrateEntity;
}
}
- GitHub is for social coding platform: if you want to write code, we encourage contributions through pull requests from forks of this repository. If you want to contribute code this way, please reference a GitHub ticket as well covering the specific issue you are addressing.
- Each major version of Hibernate has it own git branch:
- Hibernate 6.2 on the master
- Hibernate 5 on the hibernate5 branch
- Hibernate 4 on the hibernate4 branch
- Hibernate 3 on the hibernate3 branch
Download the code with git:
git clone git://github.com/arey/hibernate-hydrate.git
Compile the code with maven:
mvn clean install
If you're using an IDE that supports Maven-based projects (IntelliJ Idea, Netbeans or m2Eclipse), you can import the project directly from its POM. Otherwise, generate IDE metadata with the related IDE maven plugin:
mvn eclipse:clean eclipse:eclipse
This project artefact is published to Maven Central. The Maven Release Plugin is used to release the project with Maven. The release.yml GitHub Actions workflow automates the process.
- Uses Maven as a build tool
- Uses GitHub Actions for continuous integration builds whenever code is pushed into GitHub
- Izaak (John) Alpert and Marc Cobery and Markus Heiden for their pull requests