2014-04-08 5 views
0

나는 test1 클래스와 test2 클래스를 가지고있다.하이버 네이트 너무 많은 SQL

그들은 1 대 1이고 가져 오기 유형은 게으른 다.

@Entity 
@Table(name = "test1") 
public class Test1 { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column 
    private int id; 

    @Column(name="name") 
    private String name; 

    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
    @JoinColumn(name = "test2_id") 
    private Test2 test2; 

    ... 
} 

@Entity 
@Table(name = "test2") 
public class Test2 { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column 
    private int id; 

    @Column(name="name") 
    private String name; 

    @OneToOne(mappedBy = "test2") 

    ... 

} 

내가 데이터베이스에서 모든 레코드를 얻으려면 :

Criteria dc2 = 
    sessionFactory. getCurrentSession().createCriteria(Test1.class,"mr"); 
    List<Test1> reports2= dc2.list(); 
    for(Test1 test:reports2){ 
     test.getTest2().getName(); 
    } 

하지만 내 콘솔이 SQL을 보여입니다 게으른

Hibernate: select this_.id as id18_0_, this_.name as name18_0_, this_.test2_id as test3_18_0_ from test1 this_ 
    Hibernate: select test2x0_.id as id19_1_, test2x0_.name as name19_1_, test1x1_.id as id18_0_, test1x1_.name as name18_0_, test1x1_.test2_id as test3_18_0_ from test2 test2x0_ left outer join test1 test1x1_ on test2x0_.id=test1x1_.test2_id where test2x0_.id=? 
    Hibernate: select test1x0_.id as id18_0_, test1x0_.name as name18_0_, test1x0_.test2_id as test3_18_0_ from test1 test1x0_ where test1x0_.test2_id=? 

페치 때문에, 내가 SQL 잘 생각 ,

및 가져 오기 유형을 FetchType으로 변경합니다 .EARGER

,210
Hibernate: select this_.id as id18_1_, this_.name as name18_1_, this_.test2_id as test3_18_1_, test2x2_.id as id19_0_, test2x2_.name as name19_0_ from test1 this_ left outer join test2 test2x2_ on this_.test2_id=test2x2_.id 
Hibernate: select test1x0_.id as id18_1_, test1x0_.name as name18_1_, test1x0_.test2_id as test3_18_1_, test2x1_.id as id19_0_, test2x1_.name as name19_0_ from test1 test1x0_ left outer join test2 test2x1_ on test1x0_.test2_id=test2x1_.id where test1x0_.test2_id=? 

은 내가 만 개 기록이있는 경우 내 시간

의 그것 폐기물, 두 번째 SQL을 이해하지 않고는 10000 번 동그라미 것입니다.

어떻게 해결할 수 있습니까? 모든 기록을 제 시간에 얻으시겠습니까? 가입으로

답변

0

당신은 Hibernate가 하나 개의 쿼리와 TEST2 객체를 작성해야합니다 이런 식으로 예를

Criteria dc2 = sessionFactory. getCurrentSession().createCriteria(Test1.class,"mr"); 
dc2.setFetchMode("test2", FetchMode.JOIN) 
    List<Test1> reports2= dc2.list(); 
    for(Test1 test:reports2){ 
     test.getTest2().getName(); 
    } 

은 ...는 setFetchMode을 사용할 수 있습니다; 솔직히 나는이

안젤로

도움이되기를 바랍니다이 시나리오에서 더 많은 데이터가 DB

에서로드되기 때문에 공연에 대해 말할 수 없다