2012-04-17 38 views
14

Ormlite có hỗ trợ ba chiến lược kế thừa này không?Ormlite có hỗ trợ kế thừa không?

  • bảng mỗi hệ thống phân cấp lớp
  • bảng mỗi lớp con
  • bảng mỗi lớp bê tông

tôi thấy this discussion on the ORMLite user group, nhưng tôi không chắc chắn nó trả lời câu hỏi của tôi.

Đặc biệt tôi muốn sử dụng "phân cấp bảng cho mỗi lớp". Nếu họ không hỗ trợ từ khung ormlite tôi sẽ tạo một lớp và quên đi thừa kế, nhưng tôi muốn sử dụng thừa kế.

Trả lời

9

ORMLite không hỗ trợ tự động, không. Tôi không chắc chắn bạn thực sự đọc thread bạn liên kết với vì nó khá cụ thể về nó:

Những gì tôi cần là: Nếu tôi có lớp A như một lớp cha, và tôi có các lớp con trực tiếp B và C , và tôi chạy một truy vấn cho tất cả các bản ghi/đối tượng của lớp A, tôi muốn có tất cả các đối tượng của lớp A, B và C trả về.

Vâng, ORMLite không thực hiện việc này và hiện tại tôi không có kế hoạch hỗ trợ. Sự phức tạp của điều này, trừ khi tôi nhầm lẫn về cách thực hiện điều này, là bên ngoài những gì tôi muốn nói là "Lite". Cách Hibernate hỗ trợ các cấu trúc như vậy, là bằng cách có các khóa ngoài, nhiều bảng và phép nối.

Câu hỏi đó đưa ra một số ý tưởng về cách sử dụng ORMLite để thực hiện thừa kế:

1) Bạn có thể có lớp A và một bảng liên quan - vì vậy nó không thể là trừu tượng. Sau đó, bạn có thể có B và C mà lớp con A và có tất cả các trường As trong mỗi bảng riêng biệt. Sau đó, bạn có thể tạo một DAO đặc biệt cho A cũng sẽ truy vấn B và C và thêm chúng vào kết quả của bạn cho A.

2) Một cách khác là bạn có thể tạo lớp B và C không là lớp con nhưng thay vì có một đối tượng nước ngoài để A. Bạn có thể truy vấn tất cả các As và một số trong số họ sẽ là một phần B và một số C một phần và một số chỉ A. Bạn sau đó cũng có thể truy vấn Bs và Cs và sử dụng A DAO để làm mới và nhận được các trường của A bạn sẽ không thể truyền. Một cũng có thể có một số loại enum mà nói cho dù đó là một A, B, hoặc C. Bạn cũng có thể làm một số phép thuật, nơi bạn có thể nói getSubClassObject(), nếu nhìn vào enum và truy vấn B hoặc C dao cho đối tượng liên kết với khóa ngoài bên phải cho đối tượng A.

+0

Rất tiếc, có thể tôi chưa đủ rõ ràng về liên kết. Tôi nghĩ có lẽ họ bây giờ là một giải pháp thực hiện cho nó, bởi vì bài đăng là từ tháng 1 năm 2011, nhưng cảm ơn câu trả lời của bạn – Flow

+0

Np @Flow. Đó là một phiếu bầu khác cho tính năng đó. Nếu bạn muốn giúp thêm nó vào ORMLite, hãy gửi một số email trên danh sách gửi thư. – Gray

+0

Xin lỗi mang lại điều này, nhưng điều này có nghĩa là nếu Lớp B mở rộng Lớp A, bạn không thể có hai bảng khác nhau, trong đó Lớp B sử dụng các thuộc tính Lớp A làm cột bảng B? – Maxrunner

32

ORMlite hỗ trợ kế thừa nhưng không hỗ trợ phân đoạn thừa kế.

Sau đây là ví dụ về Thừa kế với ORMLite.

Tạo một lớp cha trừu tượng thats không một cơ sở dữ liệu bảng ORMLite nhưng có một số lĩnh vực cơ sở dữ liệu được sử dụng bởi tất cả các lớp con

public abstract class Event { 

    @DatabaseField(columnName="id", generatedId = true) 
    protected int _id; 

    @DatabaseField(columnName="name") 
    protected String name; 

    @DatabaseField(columnName="date") 
    protected Date date; 

    @DatabaseField(columnName="type") 
    protected String type; 

    public abstract void setName(String name); 
    public abstract void setDate(Date date); 
    public abstract void setType(String type); 
} 

2) Tạo một lớp kế thừa nó và thêm một số lĩnh vực (thats một Bảng Cơ sở dữ liệu)

@DatabaseTable(tableName="atividade") 
public class Atividade extends Event { 

     @DatabaseField(columnName="ala") 
     protected String ala; 

     public String getAla() { 
       return ala; 
     } 

     public void setAla(String ala) { 
       this.ala = ala; 
     } 

     public Atividade(String name, Date date, String type, String ala) { 
       this.setName(name); 
       this.setDate(date); 
       this.setTipo(type); 
       this.setAla(ala); 
     } 

     Atividade(){ 
     } 

     @Override 
     public void setName(String name) { 
       this.name = name; 
     } 

     @Override 
     public void setDate(Date date) { 
       this.date = date; 
     } 

     @Override 
     public void setType(String type) { 
       this.type = type; 
     } 
} 

Hy vọng điều đó sẽ hữu ích!

+2

Cảm ơn rất nhiều vì đã thêm câu trả lời này! Đây chính là điều tôi muốn làm. – theblang

+1

Nếu bạn có một lớp khác mở rộng Sự kiện, hãy nói Ví dụ. làm thế nào để bạn truy vấn cho cả Atividade và Ví dụ? – Bri6ko

+0

@ Bri6ko: viết vấn đề này làm câu hỏi mới và tham khảo tại đây –

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