2011-04-08 21 views
10

İlkbaharda Hazırda Bekletme özelliğini kullanıyorum.Hazırda bekletme ManyToOne FetchType.LAZY getirme tembel

Böyle bir model sınıfım var.


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

Bu genel olarak çalışır, ancak Kategori tembel yüklü değil, ama hevesle ForumEntry yüklendikten sonra.

 
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> 

biri bana neler olduğunu anlamasına yardımcı olur musunuz?

cevap

15

Sanırım bu, sınıflarınızın final olarak bildirilmiş olmasından kaynaklanıyor, bu nedenle Hazırda Bekletme, bunlar için tembel proxy oluşturamıyor. Sınıf bildirimlerinden final kaldırmaya çalışın.

+0

Bilgelerinizi paylaştığınız için teşekkür ederim efendim. – KarlsFriend

1

ForumTopic döndükten sonra işlem/oturum kapatıldı gibi görünüyor. Böylece müstakil bir varlık haline gelir. Bir getForumCategory yapmaya çalıştığınızda, işlemi yapmak için bir oturum yok. Bir liste dönmeden önce bu aynı oturumda ForumCategory alıp bunu

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

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

    return topics; 
} 

(Bir getAllForumTopic olduğu varsayıldığında), sizin getForumTopic yılında aynı oturumda gibi içinde

ForumCategory önceden getirmek olabilir. Aksi takdirde, getAllForumTopic arama işlevinde bir işlem oluşturmanız ve getForumCategory'i çağırmanız gereken yerde aynı işlemi kullanmanız gerekir.