How to fix org.hibernate.LazyInitializationException - could not initialize proxy - no Session
What is wrong here is that your session management configuration is set to close session when you commit transaction. Check if you have something like:
<property name="current_session_context_class">thread</property>
in your configuration.
In order to overcome this problem you could change the configuration of session factory or open another session and only than ask for those lazy loaded objects. But what I would suggest here is to initialize this lazy collection in getModelByModelGroup itself and call:
Hibernate.initialize(subProcessModel.getElement());
when you are still in active session.
And one last thing. A friendly advice. You have something like this in your method:
for (Model m : modelList) {
if (m.getModelType().getId() == 3) {
model = m;
break;
}
}
Please insted of this code just filter those models with type id equal to 3 in the query statement just couple of lines above.
Some more reading:
session factory configuration
problem with closed session
LazyInitializationException : Why can't Hibernate create a session on lazy loading?
Hibernate can do it by itself. With setting property hibernate.enable_lazy_load_no_trans=true
(for spring boot it should be spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
) you can load any lazy property when transaction is closed. This approach has huge drawback: each time you load lazy property, hibernate opens session and creates transaction in background.
I would recommed fetch lazy properties by entityGraphs. So you doesnt have to move persistent context do upper level or change fetch type in your entities.
LazyInitializationException in a Spring Transaction
You need to activate in your application.yml
spring:
jpa:
properties:
hibernate:
enable_lazy_load_no_trans: true
This will allow lazy loading to work outside the session that created the object that has properties that are lazy loaded.
Reference: https://www.baeldung.com/hibernate-lazy-loading-workaround, Solve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_trans and https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/
How to solve the “failed to lazily initialize a collection of role” Hibernate exception
If you know that you'll want to see all Comment
s every time you retrieve a Topic
then change your field mapping for comments
to:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<Comment>();
Collections are lazy-loaded by default, take a look at this if you want to know more.
Related Topics
How to Set the System Time in Java
How to Allow Introducing Only Digits in Jtextfield
How to Draw the Same Moving Image Multiple Times
Difference Between Java Se/Ee/Me
In Java, How to Check If a String Contains a Substring (Ignoring Case)
Aggregation Versus Composition
When and Why JPA Entities Should Implement the Serializable Interface
How to Remove the Last Character from a String
How to Re-Attach Detached Objects in Hibernate
Finding Key Associated with Max Value in a Java Map
Ideal Method to Truncate a String with Ellipsis
Bypass Generatedvalue in Hibernate (Merge Data Not in Db)