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?
The FetchType. LAZY tells Hibernate to only fetch the related entities from the database when you use the relationship. This is a good idea in general because there's no reason to select entities you don't need for your uses case. You can see an example of a lazily fetched relationship in the following code snippets.
To enable lazy loading explicitly you must use “fetch = FetchType. LAZY” on an association that you want to lazy load when you are using hibernate annotations. @OneToMany( mappedBy = "category", fetch = FetchType.
LAZY or FetchType. EAGER . By default, @OneToMany and @ManyToMany associations use the FetchType. LAZY strategy while the @OneToOne and @ManyToOne use the FetchType.
Enum FetchType. Defines strategies for fetching data from the database. The EAGER strategy is a requirement on the persistence provider runtime that data must be eagerly fetched. The LAZY strategy is a hint to the persistence provider runtime that data should be fetched lazily when it is first accessed.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With