2014-09-18 3 views
8

Ho un problema di prestazioni nel mio mapping molti-a-uno. Quando eseguo il debug della query SQL nel file di registro, la query principale è ok, ma dopo ho un'altra query che rappresenta il mapping di oggetti molti-a-uno.Il caricamento lenta di ibernazione non funziona con il mapping molti-a-uno

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> 

Query 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

Si prega di mostrare le domande che state vedendo e indicare la vostra domanda esatta. Stai chiedendo perché vedi queste domande? Stai chiedendo come modificare il tuo codice/configurazione per modificare in qualche modo le query? – Rob

risposta

2

Hai provato con FetchMode.SELECT, come questo;

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

Qual è la differenza tra lazy = "true" e fetch = "select"? –

+1

@OusmaneMINTE Controlla questo thread; http://stackoverflow.com/questions/4374528/hibernate-xml-mapping-lazy-false-or-fetch-select –

3

la mappatura sembra essere ok. Come documentato qui 5.1.1. Entity

Il <class> attributo pigro è di default vero

  • pigro (opzionale): fetching pigro può essere disabilitato impostando pigro = "false".

Lo stesso per <many-to-one>: 5.1.7.1. Using a foreign key or an association tablepigro attributo:

  • pigri (opzionale - il default proxy): per impostazione predefinita, le associazioni singolo punto sono proxy. lazy="no-proxy" specifica che la proprietà deve essere recuperata pigramente quando si accede per la prima volta alla variabile di istanza. Ciò richiede la strumentazione bytecode build-time. lazy="false" specifica che l'associazione verrà sempre recuperata con entusiasmo.

Quindi, qual è il problema?

Direi nella finestra di debug . Poiché hai un riferimento alla tua lista e stai guardando il risultato - nel momento in cui viene eseguito - viene caricato anche il riferimento. Pigramente - ma caricato. Questo è in realtà ciò che vogliamo. Proxy - quando in primo luogo tuched - sta forzando il carico.

Provare a rimuoverlo dall'orologio. Oppure chiudi la sessione e poi la metti nell'orologio ... Dovresti vedere, con la query usata sopra - non sta caricando i riferimenti ... solo quando hai veramente accesso ... anche tramite la finestra di debug

+0

Grazie per il vostro aiuto. È colpa mia ... Ho guardato nella mia classe MyEntity se non avevo il metodo hashCode() o equals() usando gli oggetti mappati, ma ho dimenticato il mio servizio di trasformazione che trasforma oggetti Hibernate in oggetti Pojo per il mio livello di presentazione ... e in questa parte faccio myEntity.getObject1() e myEntity.getObject2() .. .sorry per il post! –

+0

Se la mia risposta ti ha aiutato - bene. Se hai la tua risposta - fantastico! ;) Goditi il ​​potente Hibernate;) –