2014-09-18 17 views
8

Tôi gặp vấn đề về hiệu năng trong bản đồ nhiều người. Khi tôi gỡ lỗi truy vấn SQL trong tệp nhật ký, truy vấn chính là ok, nhưng sau khi tôi có truy vấn khác biểu diễn đối tượng nhiều đối tượng.Tải lười biếng Hibernate không hoạt động với ánh xạ nhiều đối tượng

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; 
    } 

trong 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

Vui lòng hiển thị các truy vấn bạn đang xem và nêu rõ câu hỏi chính xác của bạn. Bạn có hỏi tại sao bạn thấy các truy vấn này không? Bạn đang hỏi làm thế nào để thay đổi mã/cấu hình của bạn bằng cách nào đó thay đổi các truy vấn? – Rob

Trả lời

2

Bạn đã thử FetchMode.SELECT, như thế này;

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

Sự khác biệt giữa lazy = "true" và fetch = "select" là gì? –

+1

@OusmaneMINTE Kiểm tra chủ đề này; http://stackoverflow.com/questions/4374528/hibernate-xml-mapping-lazy-false-or-fetch-select –

3

Ánh xạ của bạn có vẻ ổn. Như tài liệu ở đây 5.1.1. Entity

Các <class> thuộc tính lười biếng là theo mặc định đúng

  • lười biếng (không bắt buộc): quyến rũ lười biếng có thể bị vô hiệu hóa bằng cách thiết lập lười biếng = "false".

Cùng cho <many-to-one>: 5.1.7.1. Using a foreign key or an association tablelười biếng thuộc tính:

  • lười biếng (không bắt buộc - mặc định là proxy): theo mặc định, các hiệp hội điểm duy nhất được ủy nhiệm. lazy="no-proxy" chỉ định rằng thuộc tính sẽ được tải xuống một cách lười biếng khi biến mẫu được truy cập lần đầu tiên. Điều này đòi hỏi công cụ bytecode xây dựng theo thời gian. lazy="false" chỉ định rằng liên kết sẽ luôn được tải xuống một cách háo hức.

Vì vậy, vấn đề ở đâu?

Tôi có thể nói trong cửa sổ gỡ lỗi của bạn. Bởi vì bạn có một tham chiếu đến danh sách của bạn, và bạn đang xem kết quả - trong thời điểm nó được thực hiện - tham chiếu cũng được nạp. Lazily - nhưng được nạp. Đó là thực tế những gì chúng ta muốn. Proxy - khi lần đầu tiên được tuched - đang buộc tải.

Cố gắng xóa nó khỏi đồng hồ. Hoặc đóng phiên và sau đó đặt nó trong đồng hồ ... Bạn sẽ thấy, taht truy vấn được sử dụng ở trên - không tải tài liệu tham khảo ... chỉ khi thực sự truy cập ... ngay cả qua cửa sổ gỡ lỗi

+0

Cảm ơn sự giúp đỡ của bạn. Đó là lỗi của tôi ... Tôi đã nhìn vào lớp MyEntity của mình nếu tôi không có phương thức hashCode() hoặc equals() bằng cách sử dụng các đối tượng được ánh xạ, nhưng tôi đã quên dịch vụ chuyển đổi của mình để biến các đối tượng Hibernate thành các đối tượng Pojo cho lớp trình bày của tôi ... Và trong phần này tôi làm myEntity.getObject1() và myEntity.getObject2() .. .xin lỗi cho bài đăng! –

+0

Nếu câu trả lời của tôi đã giúp bạn - tốt. Nếu bạn có câu trả lời của bạn - tuyệt vời! ;) Thưởng thức Hibernate mạnh mẽ;) –

Các vấn đề liên quan