Hibernate ManyToOne с FetchType.LAZY не получает ленивый - PullRequest
10 голосов
/ 08 апреля 2011

Я использую Hibernate с пружиной.

У меня есть такой модельный класс.


@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.

<pre> 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=?

Хотя получатель не был назван, ForumCategory загружается сразу после ForumTopic.

Эта проблема появляется во всех моих @ ManyToOne-ассоциациях. Однако @OneToMany ассоциации загружаются лениво.

Я использую maven2 для сборки. Это мои зависимости. <pre></p> <pre><code> <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>

Может кто-нибудь помочь мне понять, что происходит?

Ответы [ 2 ]

15 голосов
/ 08 апреля 2011

Полагаю, это связано с тем, что ваши классы объявлены как final, поэтому Hibernate не может генерировать для них ленивые прокси.Попробуйте удалить final из объявлений классов.

1 голос
/ 08 апреля 2011

Похоже, что транзакция / сессия закрыта после возврата 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...