Hibernate ManyToOne with FetchType.LAZY not fetching lazy

12,466

Solution 1

I guess it's caused by the fact that your classes are declared as final, therefore Hibernate cannot generate lazy proxies for them. Try to remove final from class declarations.

Solution 2

Looks like the transaction/session is closed after returning ForumTopic. Hence it becomes detached entity. When you try to do a getForumCategory there is no session to do the operation. You can prefetch the ForumCategory in the same session like,

In your getForumTopic, before returning a list (assuming you have a getAllForumTopic)

public List<ForumTopic> getAllForumTopic() {
  <snip> 
  List<ForumTopic> topics = <SNIP: get the list of ForumTopic>

  for(ForumTopic topic: topics)
      topic.getForumCategory()

  return topics;
}

This will fetch the ForumCategory in the same session. Otherwise you have to create a transaction in the calling function of getAllForumTopic and use the same transaction where ever you need to call getForumCategory.

Share:
12,466

Related videos on Youtube

KarlsFriend
Author by

KarlsFriend

Updated on October 13, 2020

Comments

  • KarlsFriend
    KarlsFriend over 3 years

    I am using Hibernate with spring.

    I have a model-class like this.

    
    @Entity
    @Table(name = "forumtopic")
    public final class Forumtopic extends AbstractUserTracking implements
        java.io.Serializable {
    
    /**SNIP **/
    
        private Forumcategory forumcategory;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "FkForumcategoryId", nullable = false)
        public Forumcategory getForumcategory() {
            return this.forumcategory;
        }
    
        public void setForumcategory(final Forumcategory forumcategory) {
            this.forumcategory = forumcategory;
        }
    }
    
    

    It works in general, but the Category is not loaded lazy, but eagerly after the ForumEntry has been loaded.

    Hibernate: 
        select
            forumtopic0_.PkId as PkId19_0_,
            forumtopic0_.CreateDate as CreateDate19_0_,
            forumtopic0_.FkCreateUserId as FkCreate3_19_0_,
            forumtopic0_.FkLastUserId as FkLastUs4_19_0_,
            forumtopic0_.LastChange as LastChange19_0_,
            forumtopic0_.FkForumcategoryId as FkForum10_19_0_,
            forumtopic0_.PublishCategory as PublishC6_19_0_,
            forumtopic0_.State as State19_0_,
            forumtopic0_.Text as Text19_0_,
            forumtopic0_.Topic as Topic19_0_,
            forumtopic0_.FkTpUserId as FkTpUserId19_0_ 
        from
            forumtopic forumtopic0_ 
        where
            forumtopic0_.PkId=?
    Hibernate: 
        select
            forumcateg0_.PkId as PkId17_0_,
            forumcateg0_.CreateDate as CreateDate17_0_,
            forumcateg0_.Name as Name17_0_,
            forumcateg0_.FkRequestId as FkReques4_17_0_,
            forumcateg0_.FkTpUserId as FkTpUserId17_0_ 
        from
            forumcategory forumcateg0_ 
        where
            forumcateg0_.PkId=?
    

    Altough the getter was not called the ForumCategory is loaded right after ForumTopic.

    This problems appears in all my @ManyToOne-associations. However @OneToMany associating are loaded lazily.

    I am using maven2 for the build. These are my dependencies.

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
      </dependency>
    
    
      <dependency>
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-core</artifactId> 
        <version>3.3.1.GA</version> 
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>ejb3-persistence</artifactId>
        <version>1.0.2.GA</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <type>jar</type>
        <version>3.4.0.GA</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <type>jar</type>
        <version>3.4.0.GA</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search</artifactId>
        <version>3.1.0.GA</version>
    </dependency>
    

    Can someone please help me understand what is happening?

  • KarlsFriend
    KarlsFriend about 13 years
    Thank you Sir, for sharing your wisdom.

Related