복붙노트

[SPRING] Letchy를 가져 오지 않는 FetchType.LAZY가있는 ManyToOne을 최대 절전 모드로 만듭니다.

SPRING

Letchy를 가져 오지 않는 FetchType.LAZY가있는 ManyToOne을 최대 절전 모드로 만듭니다.

봄에 최대 절전 모드를 사용하고 있습니다.

이런 모델 클래스가 있습니다.


@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가로드 된 후 열심히로드됩니다.

최대 절전 모드 :     고르다         forumtopic0_.PkId as PkId19_0_,         forumtopic0_.CreateDate as CreateDate19_0_,         forumtopic0_.FkCreateUserId as FkCreate3_19_0_,         forumtopic0_.FkLastUserId as FkLastUs4_19_0_,         LastChange19_0_으로 마지막 변경,         포럼 순위 0_.FkForumcategoryId로서 FkForum10_19_0_,         forumtopic0_.PublishCategory as PublishC6_19_0_,         State19_0_으로 상태,         forumtopic0_.Text as Text19_0_,         Topic19_0_으로 forumtopic0_.Topic,         FtpUserId19_0_으로 포럼 토크 0_.FkTpUserId     ...에서         포럼 토픽 0_     어디에         forumtopic0_.PkId =? 최대 절전 모드 :     고르다         forumcateg0_.PkId as PkId17_0_,         forumcateg0_.CreateDate as CreateDate17_0_,         forumcateg0_ 이름을 Name17_0_으로,         forumcateg0_.FkRequestId as FkReques4_17_0_,         FkTpUserId17_0_으로 포럼 등급 0_.FkTpUserId     ...에서         forumcategory forumcateg0_     어디에         forumcateg0_.PkId =?

해결법

  1. ==============================

    1.나는 그것이 당신의 클래스가 final로 선언되었다는 사실에 기인한다고 생각한다. 그러므로 Hibernate는 그것들을위한 게으른 프록시를 생성 할 수 없다. 클래스 선언에서 final을 제거하십시오.

    나는 그것이 당신의 클래스가 final로 선언되었다는 사실에 기인한다고 생각한다. 그러므로 Hibernate는 그것들을위한 게으른 프록시를 생성 할 수 없다. 클래스 선언에서 final을 제거하십시오.

  2. ==============================

    2.ForumTopic을 반환 한 후 트랜잭션 / 세션이 닫힌 것 같습니다. 따라서 분리 된 개체가됩니다. getForumCategory를 수행하려고하면 조작을 수행 할 세션이 없습니다. 같은 세션에서 ForumCategory를 프리 페치 할 수 있습니다.

    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를 호출해야하는 곳에서 동일한 트랜잭션을 사용해야합니다.

  3. from https://stackoverflow.com/questions/5594297/hibernate-manytoone-with-fetchtype-lazy-not-fetching-lazy by cc-by-sa and MIT license