2010-12-07 40 views
16

Tôi có một câu hỏi đơn giản. Tôi tìm thấy cấu hình Hibernate này vào dự án của chúng tôi:Lập bản đồ XML Hibernate: Lừa sai hoặc Tìm nạp?

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    lazy="false" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Không lấy = "chọn" có nghĩa là "tải Lazy tất cả các bộ sưu tập và các tổ chức" dựa trên Fetching Strategies. Nhưng bằng cách viết lazy = "false" có nghĩa là không tải lười. Vì vậy, cấu hình ở trên nói: "Vô hiệu hóa tải chậm. Cho phép tải chậm". Trong thực tế, điều này có nghĩa là tài sản là lười biếng nạp?

Vì vậy, tôi có thể rút ngắn mà cấu hình như sau:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Nhưng không lấy = "chọn" chế độ mặc định? Vì vậy, có hiệu lực, tôi có thể khai báo cùng một cấu hình như:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Tôi có đúng không? Sai rồi? Ý tưởng? Cảm ơn

Nếu tôi muốn bật tải chậm, tôi phải thêm lazy = "true" và xóa lazy = "false"?

Trả lời

38

Tôi nghĩ rằng Chế độ tìm nạp và thời gian tìm nạp là các khái niệm không hoàn toàn trùng lặp.

Lazy="true|false" kiểm soát xem liên kết được tải háo hức hoặc theo yêu cầu.

fetch="select|subselect|join|batch" kiểm soát cách thực thể hoặc bộ sưu tập được tải, khi nào cần được tải.

Vì vậy, để trả lời câu hỏi của bạn, có fetch="select" có nghĩa là:

"SELECT thứ hai được sử dụng để lấy các thực thể hoặc bộ sưu tập liên quan Trừ khi bạn vô hiệu hóa một cách rõ ràng quyến rũ lười biếng bằng cách xác định lười biếng =." False", điều này lựa chọn thứ hai sẽ chỉ được thực hiện khi bạn truy cập liên kết. " (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching)

Điều này không có nghĩa là tải chậm bị vô hiệu hóa! Điều đó được kiểm soát bởi cờ lazy="true|false". Với lazy="true"fetch="select" Hibernate sẽ tải bộ sưu tập xuống và sẽ tải nó bằng một lựa chọn. Nếu bạn đặt lazy="false", cùng một lựa chọn sẽ được thực hiện, sự khác biệt sẽ là nó sẽ được thực hiện háo hức. Hy vọng điều này có ý nghĩa.

Hãy xem tại đây: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

0

Nếu bạn đặt thành lười, thì bản đồ bên ngoài sẽ không chọn nhân viên nếu không cần thiết. Việc tìm nạp cho thấy nó sẽ truy vấn nhân viên như thế nào nếu cần thiết.

+0

Thêm cả hai thuộc tính không thừa? Họ không phủ nhận lẫn nhau, phải không? – chris

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