2014-09-18 17 views
8

Bire bir eşleştirmelerimde performans sorunu yaşıyorum. SQL sorgusu günlük dosyasında hata ayıkladığında, temel sorgu tamam, ancak çoktan bir nesne eşleştirmesini temsil eden başka bir sorguyu aldıktan sonra.Hazırda bekleme tembelli yükleme, bire bir eşlemeyle çalışmaz

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> 

Sorgu 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; 
    } 
pom.xml'Bu

<!-- 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

Lütfen gördüğünüz sorguları gösterin ve tam sorunuzu belirtin. Bu sorguları neden gördüğünüzü soruyor musunuz? Kodunuzu/yapılandırmanızı nasıl değiştireceğini sorgular mı değiştiriyorsunuz? – Rob

cevap

2

Denediniz mi? FetchMode.SELECT, bunun gibi;

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

Tembel = "true" ve fetch = "select" arasındaki fark nedir? –

+1

@OusmaneMINTE Bu konuyu kontrol edin; http://stackoverflow.com/questions/4374528/hibernate-xml-mapping-lazy-false-or-fetch-select –

3

Kişisel haritalama ok gibi görünüyor. Burada 5.1.1. Entity

belgelendiği gibi tembel gerçek varsayılan olarak <class> nitelik

  • tembel (opsiyonel): tembel getiriliyor tembel ayarlayarak devre dışı bırakılabilir = "false". <many-to-one> için

aynı: 5.1.7.1. Using a foreign key or an association tabletembel nitelik:

  • tembel (opsiyonel - vekaleten varsayılan): Varsayılan olarak, tek nokta dernekler temsil edilmektedir. lazy="no-proxy", örnek değişkenine ilk erişildiğinde, özelliğin getirilmesi gerektiğini belirtir. Bu, yapı zamanı bayt kodu enstrümantasyonu gerektirir. lazy="false", ilişkinin her zaman hevesle alınacağını belirtir.

Sorun nerede?

hata ayıklama pencerenizde hata iletisini söyleyebilirim. Çünkü listenizde bir referansınız var ve sonucu izliyorsunuz - yürütüldüğü anda - referans da yüklenir. Lazily - ama yüklendi. Aslında istediğimiz bu. Proxy - ilk kez yapıştırıldığında - yükü zorluyor.

Saatten çıkarmaya çalışın. Veya oturumu kapatın ve sonra saatin içine koyun ... Gördüğünüz gibi, yukarıda kullanılan sorgu taht - yüklemiyor değil ... sadece gerçekten erişildiğinde ... hata ayıklama penceresinden bile

+0

Yardımlarınız için teşekkür ederiz. Bu benim hatam ... Eşlenen nesneleri kullanarak hashCode() veya equals() yöntemini kullanmamış olsaydım MyEntity sınıfıma baktım ama sunum katmanım için Hazırda Nesneleri Pojo nesnelerine dönüştüren dönüştürme hizmetimi unuttum ... ve bu bölümde myEntity.getObject1() ve myEntity.getObject2() 'yi yapıyorum. –

+0

Cevabım size yardımcı olsaydı - iyi. Cevabınız varsa - harika! ;) Güçlü Hibernate'in keyfini çıkarın;) –

İlgili konular