복붙노트

[SPRING] 최대 절전 모드 ManyToOne FetchType.LAZY가 작동하지 않습니까?

SPRING

최대 절전 모드 ManyToOne FetchType.LAZY가 작동하지 않습니까?

나는 봄 4.1.4.RELEASE + 최대 절전 모드 4.3.6을 사용하고 있습니다. 최종, 여기 엔티티 코드가 있습니다 :

public class BaseEntity implements Serializable {
}


public class MarketInfo extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = "market_id", unique = true, length = 15)
    private String marketId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "market")
    private List<MarketChannelGroup> channelGroups;

    public List<MarketChannelGroup> getChannelGroups() {
        return channelGroups;
    }

    public void setChannelGroups(List<MarketChannelGroup> channelGroups) {
        this.channelGroups = channelGroups;
    }

...
}

public class MarketChannelGroup extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "market_id", referencedColumnName = "market_id")
    private MarketInfo market;
...
}

내 테스트에서 나는 getChannelGroups ()를 호출하면 각 MarketChannelGroup 내부의 MarketInfo가 가져 오지만 (이 경우 getChannelGroups (), channelGroups가 null 인 경우) MarketInfo의 channelGroups가 제대로 작동하는지 확인할 수 있습니다. 시장의 가져 오기 모드가 FetchType.LAZY이므로 발생합니다.

콘솔에서 getter를 호출하면 다음과 같은 최대 절전 모드 로그가 표시됩니다.

Hibernate: select channelgro0_.market_id as market_i5_12_1_, channelgro0_.id as id1_9_1_, channelgro0_.id as id1_9_0_, channelgro0_.channel_group_id as channel_2_9_0_, channelgro0_.channel_group_name as channel_3_9_0_, channelgro0_.channel_group_type as channel_4_9_0_, channelgro0_.market_id as market_i5_9_0_ from market_channel_group channelgro0_ where channelgro0_.market_id=?
Hibernate: select marketinfo0_.id as id1_12_0_, marketinfo0_.enable_flag as enable_f2_12_0_, marketinfo0_.enable_time as enable_t3_12_0_, marketinfo0_.market_id as market_i4_12_0_, marketinfo0_.market_name as market_n5_12_0_, marketinfo0_.stb_count as stb_coun6_12_0_ from market_info marketinfo0_ where marketinfo0_.market_id=?
Hibernate: select marketinfo0_.id as id1_12_0_, marketinfo0_.enable_flag as enable_f2_12_0_, marketinfo0_.enable_time as enable_t3_12_0_, marketinfo0_.market_id as market_i4_12_0_, marketinfo0_.market_name as market_n5_12_0_, marketinfo0_.stb_count as stb_coun6_12_0_ from market_info marketinfo0_ where marketinfo0_.market_id=?
Hibernate: select marketinfo0_.id as id1_12_0_, marketinfo0_.enable_flag as enable_f2_12_0_, marketinfo0_.enable_time as enable_t3_12_0_, marketinfo0_.market_id as market_i4_12_0_, marketinfo0_.market_name as market_n5_12_0_, marketinfo0_.stb_count as stb_coun6_12_0_ from market_info marketinfo0_ where marketinfo0_.market_id=?

아무도 도와 줄 수 있니?

최신 정보 ManyToOne 주석에 대한 선택적 방법이 없으므로 OneToOne의 솔루션이 내 경우에는 작동하지 않습니다.

해결법

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

    1.다음과 같이 @OneToMany 주석을 선언에서 getter 메소드로 이동하십시오.

    다음과 같이 @OneToMany 주석을 선언에서 getter 메소드로 이동하십시오.

    private List<MarketChannelGroup> channelGroups;
    
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "market")
    public List<MarketChannelGroup> getChannelGroups() {
        return channelGroups;
    }
    
  2. ==============================

    2.구성 아카이브는 어떻게됩니까? OpenEntityManagerInViewFilter 필터를 사용하고 있는지 확인하십시오. 만약 당신이 그것을 사용한다면, 당신은 항상 Lazy getChannelGroups () 메소드를 호출한다. 최대 절전 모드는 각 요소 내부에서 가져올 것이다.

    구성 아카이브는 어떻게됩니까? OpenEntityManagerInViewFilter 필터를 사용하고 있는지 확인하십시오. 만약 당신이 그것을 사용한다면, 당신은 항상 Lazy getChannelGroups () 메소드를 호출한다. 최대 절전 모드는 각 요소 내부에서 가져올 것이다.

  3. ==============================

    3.@id가 getter에 있으면 getTo에 oneToMany 주석을 사용해야합니다. 게으른 작동하지만 당신이나 일부 프레임 워크가 그 transction에 게으른 속성을 얻을 경우 get 메서드를 선택하십시오.

    @id가 getter에 있으면 getTo에 oneToMany 주석을 사용해야합니다. 게으른 작동하지만 당신이나 일부 프레임 워크가 그 transction에 게으른 속성을 얻을 경우 get 메서드를 선택하십시오.

  4. from https://stackoverflow.com/questions/39748211/hibernate-manytoone-fetchtype-lazy-is-not-working by cc-by-sa and MIT license