2009-05-23 32 views
25

Một trong những lý do chính tôi sử dụng Hibernate là nó cung cấp sự linh hoạt để chuyển sang cơ sở dữ liệu khác mà không phải viết lại bất kỳ mã nào.Cách thanh lịch để xử lý chế độ xem cơ sở dữ liệu trên các thực thể ngủ đông?

Nhưng cho đến bây giờ tôi không tìm ra cách tốt để xác định các khung nhìn bổ sung trên các bảng mà các thực thể ngủ đông của tôi được khớp; Tôi vẫn đang sử dụng các kịch bản SQL đơn giản cho điều đó. Có cách nào thanh lịch hơn để định nghĩa các khung nhìn trên các bảng được quản lý bởi ngủ đông không?

Lý tưởng nhất là tôi muốn sử dụng HQL hoặc một phương pháp chung khác để thực hiện công việc, để tôi không phải lo lắng về các tập lệnh SQL không tương thích với các loại cơ sở dữ liệu khác.

Nếu có cách nào để làm điều đó, một vấn đề thứ hai sẽ là nhận các trường hợp chỉ đọc 'tổng hợp' từ các chế độ xem này, điều này sẽ giúp việc đưa dữ liệu tổng hợp vào giao diện người dùng dễ dàng hơn nhiều.

EDIT:

Có vẻ như nếu tôi không làm cho vấn đề rõ ràng đủ, vì vậy đây là những gì tôi đang cố gắng để làm: Tôi muốn viết code mà không phụ thuộc vào cơ sở dữ liệu sử dụng. Kể từ khi tôi sử dụng ngủ đông, tôi sẽ chỉ phải thay đổi tập tin cấu hình phương ngữ và sau đó có thể sử dụng một DBMS.

Câu hỏi: làm thế nào để tạo ra xem trên thực thể ngủ đông của tôi mà không dựa vào một phương ngữ SQL cụ thể (để giữ cho mọi thứ xách tay), hoặc thậm chí HQL? Và nếu có thể, tôi có thể sử dụng HQL để truy vấn các chế độ xem này, tức là để tạo các thực thể tổng hợp chỉ đọc không? Có plug-in bổ sung hibernate để giúp tôi với điều đó không? Đã không tìm thấy bất kỳ điều gì cho đến thời điểm này ...: -/

Trả lời

22

Hibernate sẽ không tự động tạo ra các quan điểm cho bạn, vì mỗi phương ngữ chỉ hỗ trợ một tập hợp con hạn chế về ngôn ngữ dữ liệu định nghĩa (DDL) của cơ sở dữ liệu cơ bản. Về cơ bản, nó hỗ trợ đủ DDL để tạo ra một lược đồ làm việc, nhưng không đủ để xử lý việc tạo ra các đối tượng "thêm" như các khung nhìn.

Tất cả sẽ không bị mất. Hibernate cung cấp cho bạn khả năng tự tạo (và thả) các đối tượng cơ sở dữ liệu bổ sung trong các tệp ánh xạ XML và các đối tượng đó có thể được phạm vi đến một phương ngữ cụ thể.Ví dụ, tôi có thể có một ánh xạ như thế này:

<hibernate-mapping> 
    <class name='com.mycompany.myproduct.Customer' table='tbl_customer'> 
    <id name='id' column='customer_id'> 
     <generator class='native'/> 
    </id> 
    <property name='name' length='50' unique='true' not-null='true' /> 
    </class> 

    <database-object> 
    <create>create or replace view read_only_cust...</create> 
    <drop>drop view read_only_cust</drop> 
    <dialect-scope name='org.hibernate.dialect.Oracle9Dialect' /> 
    </database-object> 
</hibernate-mapping> 

Bạn đang miễn phí để tạo ra bất cứ điều gì quan điểm bổ sung mà bạn muốn bằng cách bổ sung thêm "cơ sở dữ liệu đối tượng" phần. Bạn phải tự viết SQL (DDL) cho mỗi cơ sở dữ liệu mà bạn muốn hỗ trợ, nhưng vì chúng được đưa vào phương ngữ, Hibernate sẽ chỉ thực thi SQL cho phương ngữ được chọn trong thời gian xuất lược đồ.

+1

Cảm ơn! Đây có vẻ là cách duy nhất để làm điều đó. Vẫn còn tốt hơn so với có kịch bản SQL nằm xung quanh ... :-) –

0

Bạn có thể khai báo các chế độ xem trực tiếp bên trong cơ sở dữ liệu không? Sau đó, bạn chỉ có thể chọn trực tiếp từ các chế độ xem. Hãy xem chapter 10.4.4 of the Hibernate manual

Điều đó sẽ cho phép bạn chọn từ chế độ xem cơ sở dữ liệu và giúp Hibernate tự động hydrate dữ liệu vào thực thể của bạn.

Tất nhiên, chế độ xem không có bất kỳ thông số nào. Hibernate 3 có nghĩa vụ hỗ trợ các thủ tục lưu sẵn, nhưng tôi đã sử dụng nó.

+0

Cám ơn câu trả lời của bạn. Tôi gues có một chút hiểu lầm ở đây (tôi sẽ chỉnh sửa các câu hỏi và làm cho nó rõ ràng hơn): nó không phải về việc sử dụng SQL để lấy các thực thể Hibernate, nhưng nhiều cách khác vòng: làm thế nào để khai báo xem * trên * hibernate thực thể mà không cần sử dụng SQL (mà phụ thuộc vào hệ thống DB được sử dụng và do đó mâu thuẫn với iddea cơ bản là DBMS độc lập, IMHO). –

0

Bạn có ý nghĩa gì khi "tạo chế độ xem"? Tôi biết ý nghĩa của nó trong bối cảnh DB thuần túy - nhưng đó không phải là ý của bạn - đúng không?

Bạn có thể ánh xạ các lớp Java mới vào cùng một bảng để tạo "khung nhìn" hoặc bạn có thể sử dụng HQL để chọn một tập con của các cột được ánh xạ bởi các lớp liên tục khác.

HTH

12

Đã cùng một vấn đề và tìm ra giải pháp sau đây trong doucmentation ngủ đông:

Không có sự khác biệt giữa một cái nhìn và một bảng cơ sở cho một lập bản đồ Hibernate. Điều này minh bạch ở cấp cơ sở dữ liệu , mặc dù một số DBMS làm không hỗ trợ chế độ xem phù hợp, đặc biệt là với các bản cập nhật. Đôi khi bạn muốn sử dụng chế độ xem nhưng bạn không thể tạo một chế độ xem trong cơ sở dữ liệu (ví dụ: với lược đồ cũ). Trong trường hợp này, bạn có thể ánh xạ một bất biến và read-only thực thể để một biểu thức cho SQL subselect:

<class name="Summary"> 
    <subselect> 
     select item.name, max(bid.amount), count(*) 
     from item 
     join bid on bid.item_id = item.id 
     group by item.name 
    </subselect> 
    <synchronize table="item"/> 
    <synchronize table="bid"/> 
    <id name="name"/> 
    ... 
</class> 

https://docs.jboss.org/hibernate/stable/core/manual/en-US/html_single/#mapping-declaration

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