2014-09-18 15 views
8

Ich habe ein Problem der Leistung in meiner Viele-zu-eins-Zuordnung. Wenn ich die SQL-Abfrage in der Protokolldatei debugge die Principal-Abfrage ist es in Ordnung, aber nachdem ich andere Abfrage für Viele-zu-eins-Objekt Zuordnung haben.Hibernate Lazy Loading funktioniert nicht mit Many-to-One-Mapping

Entity.hbm.xml:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 

<hibernate-mapping> 
    <class name="com.omb.database.mapping.MyEntity" table="MY_ENTITY"> 
     <id name="id" type="java.lang.Integer"> 
      <column name="ENTITY_ID"/> 
      <generator class="sequence"> 
       <param name="sequence">SEQ_MY_ENTITY</param> 
      </generator> 
     </id> 

     <property name="prop1" type="string" column="PROP1" /> 
     <many-to-one name="object1" column="OBJECT1_ID" class="com.omb.database.mapping.Object1" /> 
     <many-to-one name="object2" column="OBJECT2_ID" class="com.omb.database.mapping.Object2" /> 

    </class> 
</hibernate-mapping> 

Object1.hbm.xml:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 

<hibernate-mapping default-lazy="true"> 

    <class name="com.omb.database.mapping.Object1" table="TABLE_OBJECT_1"> 
     <id name="id" type="java.lang.Integer" column="OBJECT1_ID" /> 
     <property name="label" type="string" column="LABEL_OBJECT_1" length="15" /> 
    </class> 

</hibernate-mapping> 

Object2.hbm.xml:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 

<hibernate-mapping default-lazy="true"> 

    <class name="com.omb.database.mapping.Object2" table="TABLE_OBJECT_2"> 
     <id name="id" type="java.lang.Integer" column="OBJECT2_ID" /> 
     <property name="label" type="string" column="LABEL_OBJECT_2" length="15" /> 
    </class> 

</hibernate-mapping> 

Abfrage HBM:

public List<Entity> findByObject1Id(Integer object1Id) throws DataAccesException { 

     List<Entity> results = null; 
     try { 
      Query query = this.getSession().createQuery(
        "from Entity ent where ent.object1.id = :object1Id"); 
      query.setParameter("object1Id", object1Id); 
      results = query.list(); 
     } catch (HibernateException hbe) { 
      throw new DataAccesException(hbe); 
     } 

     return results; 
    } 

in pom.xml

<!-- Hibernate 3 --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate</artifactId> 
      <version>3.2.6.ga</version> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.transaction</groupId> 
        <artifactId>jta</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>net.sf.ehcache</groupId> 
        <artifactId>ehcache</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>asm</groupId> 
        <artifactId>asm-attrs</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
+0

Bitte zeigen Sie die Fragen, die Sie sehen, und geben Sie Ihre genaue Frage an. Fragen Sie, warum Sie diese Abfragen sehen? Fragen Sie, wie Sie Ihren Code/Ihre Konfiguration ändern können, um die Abfragen irgendwie zu ändern? – Rob

Antwort

2

Haben Sie mit versucht FetchMode.SELECT, so;

<many-to-one name="object1" column="OBJECT1_ID" class="com.omb.database.mapping.Object1" fetch="select" /> 
+1

Was ist der Unterschied zwischen lazy = "true" und fetch = "select"? –

+1

@OusmaneMINTE Überprüfen Sie diesen Thread; http://stackoverflow.com/questions/4374528/hibernate-xml-mapping-lazy-false-or-fetch-select –

3

Ihr Mapping scheint in Ordnung zu sein. Wie hier dokumentierte 5.1.1. Entity

Die <class> Attribut faul von echtem Standard ist

  • faul (optional): lazy fetching indem faul deaktiviert werden kann = "false".

Das gleiche gilt für <many-to-one>: 5.1.7.1. Using a foreign key or an association tablefaul Attribut:

  • faul (optional - standardmäßig Proxy): standardmäßig sind Single-Point-Verbände proxied. lazy="no-proxy" gibt an, dass die Eigenschaft langsam abgerufen werden soll, wenn auf die Instanzvariable zum ersten Mal zugegriffen wird. Dies erfordert Build-Time-Bytecode-Instrumentierung. lazy="false" gibt an, dass die Assoziation immer eifrig abgerufen wird.

Also, wo ist das Problem?

Ich würde in Ihrem Debug-Fenster sagen. Weil Sie einen Verweis auf Ihre Liste haben und Sie das Ergebnis sehen - in dem Moment, in dem es ausgeführt wird - wird die Referenz ebenfalls geladen. Faul - aber geladen. Das wollen wir eigentlich. Proxy - wenn zuerst tucked - zwingt die Last.

Versuchen Sie, es aus der Uhr zu entfernen. Oder schließen Sie die Sitzung und legen Sie es in die Uhr ... Sie sollten sehen, dass die Abfrage oben verwendet - lädt keine Referenzen ... nur wenn wirklich zugegriffen ... sogar über Debug-Fenster

+0

Vielen Dank für Ihre Hilfe. Es ist meine Schuld ... Ich habe in meiner MyEntity-Klasse gesucht, wenn ich die Methode hashCode() oder equals() nicht mit den gemappten Objekten hatte, aber meinen Transformationsdienst, der Hibernate-Objekte in Pojo-Objekte für meine Präsentationsebene umwandelt, vergessen habe ... und in diesem Teil mache ich myEntity.getObject1() und myEntity.getObject2() .. .sorry für den Beitrag! –

+0

Wenn meine Antwort Ihnen geholfen hat - gut. Wenn Sie Ihre Antwort haben - großartig! ;) Viel Spaß beim Hibernate;) –