2012-04-01 40 views
6

Tôi muốn ánh xạ một mô hình miền tới cơ sở dữ liệu quan hệ bằng cách sử dụng một trong các khung công tác ORM cho Java. Thật không may, không ai trong số họ dường như có sự hỗ trợ đầy đủ cho các lớp thực hiện nhiều giao diện. Nói rằng tôi muốn để ánh xạ một cái gì đó như:Java ORM: Nhiều (giao diện) thừa kế

public interface Quotable { 
} 

public interface Tradable { 
} 

// StockIndex only implements Quotable as it cannot be trade directly 
public class StockIndex implements Quotable { 
} 

// Stock implements both interfaces as there are market quotes and can be traded 
public class Stock implements Quotable, Tradable { 
} 

public class Quote { 
    private Quotable quotable; 
} 

public class Trade { 
    private Tradable tradable; 
} 

Vì vậy, những gì tôi đang cố gắng để đạt được là báo giá có thể tham khảo bất kỳ có giá trị ở thị trường (chứng khoán, StockIndex và những người khác) trong khi một thương chỉ có thể tham khảo các đơn vị có thể mua bán. Tôi đã thử OpenJPA và (đồng bằng) Hibernate không có may mắn mặc dù hỗ trợ cho các giao diện sau này trông đầy hứa hẹn.

Có khung nào có thể xử lý kịch bản của tôi không? Hoặc có bất kỳ lý do chính đáng nào tại sao điều này không được ánh xạ tới cơ sở dữ liệu không? Nếu vậy, mô hình của tôi nên được sửa đổi như thế nào?

lập bản đồ Hibernate ban đầu của tôi nhìn một cái gì đó như thế này (tôi không hiển thị bất cứ thứ OpenJPA vì nó không hỗ trợ giao diện thừa kế hoặc ít nhất là tôi không thể tìm ra cách):

<hibernate-mapping package="com.foo"> 
    <class name="Quotable" table="quotable" > 
     <id type="java.lang.Long" column="id"> 
      <generator class="sequence" /> 
     </id> 

     <discriminator column="type" type="string" /> 

     <subclass name="StockIndex"> 
      <join table="stock_index" > 
       <key column="id"/> 
       <property name="name" column="name" access="field" /> 
      </join> 
     </subclass> 

     <subclass name="Stock"> 
      <join table="stock" > 
       <key column="id"/> 
       <property name="name" column="name" access="field" /> 
      </join> 
     </subclass> 
    </class> 
</hibernate-mapping> 

Đây là khá nhiều giống với ví dụ trong Hibernate documentation và kết quả trong một bảng dẫn chứng được với một id và một cột chuỗi phân biệt, một bảng stock_index với một id và chỉ số' tên và một bảng cổ với một id và tên cổ phiếu. Cho đến nay rất tốt ...

Nhưng tôi phải làm gì với giao diện Tradeable? Tôi sẽ phải thiết lập một hệ thống phân cấp và bản đồ riêng biệt trong cả hai hệ thống phân cấp. Tôi đã cố gắng này nhưng đã phải xác định tên thực thể khác nhau cho cổ phiếu (và cần thiết để bao gồm this patch) nhưng điều này cũng không hoạt động do vi phạm chính nước ngoài. Tôi đã thử một vài thứ tối nghĩa khác không hoạt động.

Dù sao, ánh xạ Chứng khoán hai lần sẽ không phải là một giải pháp tốt vì ứng dụng sẽ phải nhớ thêm các phiên bản Cổ hai lần - một lần cho mỗi giao diện. Tôi muốn có khuôn khổ xử lý automaticaly này.

Lý tưởng nhất là Hibernate sẽ cho phép mở rộng nhiều giao diện, ví dụ: một cái gì đó tương tự (lưu ý kéo dài thuộc tính trên yếu tố subclass):

<subclass name="Stock" extends="Quotable, Tradable" > 
    <join table="stock" > 
     <key column="id"/> 
     <property name="name" column="name" access="field" /> 
    </join> 
</subclass> 

Bất kỳ ý tưởng khác như thế nào ví dụ của tôi có thể được ánh xạ? Bây giờ tôi đã tìm hiểu về các yếu tố <any> mà hình như nó có thể làm việc cho tôi nhưng tôi vẫn chưa hiểu tất cả các tác động của nó.

Còn các khung công tác khác thì sao? Tôi đã nghe EclipseLink cũng có một số hỗ trợ cho các giao diện nhưng nó không được tài liệu tốt.

+5

Bạn chưa thực sự giải thích những gì không hiệu quả hoặc cách bạn thực hiện ánh xạ. –

+0

Bây giờ tôi đã bao gồm bản đồ Hibernate của tôi với một số chi tiết hơn về những gì tôi đã thử. Hy vọng nó trở nên rõ ràng hơn bây giờ. – kaiboy

Trả lời

3

Tôi không nghĩ rằng bạn sẽ tìm thấy bất kỳ ORM nào có thể xử lý phân cấp giao diện độc đáo. Vì vậy, tôi sẽ không nói về ORM ở đây nhưng tôi sẽ chỉ cho bạn cách thực hiện ví dụ của bạn bằng cách sử dụng Qi4j.

Qi4j là triển khai Lập trình định hướng hỗn hợp, sử dụng nền tảng Java tiêu chuẩn và khung cho phát triển ứng dụng tập trung vào miền, bao gồm các khái niệm phát triển từ AOP, DI và DDD. Xem http://qi4j.org

Trong Qi4j, trạng thái tên miền được mô hình hóa bằng cách sử dụng Thực thể và giá trị. Trong mẫu mã sau tôi giả định rằng mọi thứ đều là thực thể nhưng số dặm của bạn có thể thay đổi.

Vì thực thể được khai báo chỉ sử dụng giao diện, trường hợp sử dụng của bạn phải phù hợp với độc đáo.

interface Quotable { ... } 
interface Tradable { ... } 
interface StockIndex extends Quotable { ... } 
interface Stock extends Quotable, Tradable { ... } 
interface Quote { 
    Association<Quotable> quotable(); 
} 
interface Trade { 
    Association<Tradable> tradable(); 
} 

Sau đó, bạn có thể lưu trữ các đề tài đó trong một EntityStore và sử dụng API truy vấn để truy xuất dễ dàng (và theo cách đa hình).

Lưu ý rằng Qi4j EntityStores không chỉ dựa trên SQL mà còn hỗ trợ cơ sở dữ liệu NoSQL. Xem các tiện ích mở rộng khả dụng tại đây: http://qi4j.org/latest/extensions.html

Xem tài liệu về Qi4j nếu bạn có thêm câu hỏi.

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