2011-04-08 58 views
10

我使用彈簧休眠。Hibernate的多對一​​與FetchType.LAZY不取懶

我有一個模型類是這樣的。


@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; 
    } 
} 

它一般工作,但類沒有加載懶惰,但急切地在ForumEntry加載後。

 
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> 

有人可以幫我明白髮生了什麼?

回答

15

我想這是由於你的類聲明爲final,因此Hibernate無法爲它們生成懶惰代理。嘗試從類聲明中刪除final

+0

謝謝主席先生,分享您的智慧。 – KarlsFriend 2011-04-08 13:44:02

1

貌似事務/會話返回ForumTopic後關閉。因此它變成了分離的實體。當您嘗試執行getForumCategory時,沒有會話執行操作。您可以預取ForumCategory在同一會話一樣,

在你getForumTopic,返回一個列表前(假設你有一個getAllForumTopic)

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

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

    return topics; 
} 

這將在同一會話獲取ForumCategory。否則,您必須在getAllForumTopic的調用函數中創建一個事務,並使用您需要調用getForumCategory的相同事務。