2012-04-01 2 views
0

ich ein interessantes Problem mit Hibernate haben, sieht das Modell wie folgt aus:Hibernate erzeugt mehrere SQL-Abfragen, auch wenn ich Links verwenden holen join

@NamedQueries({ 
    @NamedQuery(name = "A.test", query = "SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.pk.b WHERE a.pk.b.pk.c.id = :cId AND a.pk.b.pk.d.id = :dId") 
}) 
@Entity 
@Table(name = "AT") 
public class A implements Serializable { 

    @EmbeddedId 
    private APK pk; 
} 

@Embeddable 
public class APK implements Serializable { 

    @ManyToOne 
    @JoinColumns({@JoinColumn(name = "***", referencedColumnName = "***"), 
        @JoinColumn(name = "***", referencedColumnName = "***") 
    }) 
    private B b; 
} 

@Entity 
@Table(name = "BT") 
public class B implements Serializable { 

    @EmbeddedId 
    private BPK pk; 
} 


@Embeddable 
public class APK implements Serializable { 

    @ManyToOne 
    @JoinColumn(name = "***", referencedColumnName = "***") 
    private C c; 

    @ManyToOne 
    @JoinColumn(name = "***", referencedColumnName = "***") 
    private D d; 
} 

Das Problem ist, dass die benannte Abfrage zusätzliche SQL-Abfragen macht .. Was ist das Problem? Danke!

Antwort

1

Hibernate ruft standardmäßig viele Eins-zu-Eins-Referenzen ab. Bei der Auswahl von "A" in Ihrer benannten Abfrage gibt es eine Anzahl von vielen zu eins Referenzen, die aufgelöst werden, und diese entsprechen den SQL-Abfragen, die Sie sehen. Dieses Standardverhalten von Ruhezustand kann durch vernünftige Platzierung von Lazy Loading auf Ihre viele zu einer Annotationen überschrieben werden, z. B .:

+0

Vielen Dank! Es funktioniert jetzt. Aber ich habe gelesen, dass die Einstellung von fetchtype in der @ManyToOne-Assoziation keine Auswirkungen auf Abfragen hat. Ich glaube, ich habe etwas verpasst, also gehe ich zurück zu den Handbüchern. : S – nerd