2012-02-05 33 views
5

Tôi không thể tìm thấy bất kỳ tài liệu nào về cách thích hợp để tạo mối quan hệ nhiều-nhiều giữa các đối tượng bằng cách sử dụng Objectify trên Google App Engine.Làm cách nào để tạo mối quan hệ nhiều với Objectify trên Google App Engine?

Có ai có thể giải thích cách thực hiện việc này không? Tôi có cần phải tạo một lớp "tham gia" mới cho điều này không? Nó sẽ hiệu quả như thế nào?

Trả lời

2

Bạn cần hỗ trợ những loại truy vấn nào?

Giải pháp đơn giản nhất là:

@Entity 
public class StoredObject { 
    @Id 
    private Long id; 

    private List<Long> relatedIds; 
} 

sau đó, đưa ra một StoredObject, bạn có thể gọi objectify.get(StoredObject.class, storedObject.getRelatedIds()) để lấy tất cả id liên quan.

Để tăng tốc một số truy vấn trong ứng dụng của riêng tôi, tôi đã tạo một vài lớp tham gia. Các chi phí đến lúc ghi-thời gian (bạn phải duy trì các tham gia) nhưng sau đó thời gian đọc là một quét chỉ mục duy nhất với kết quả liên tiếp!

+0

Bạn có thể làm sáng tỏ làm thế nào bạn thực hiện các lớp tham gia của bạn? Tôi lo ngại về hiệu quả nếu tôi có hàng ngàn phần tử trong danh sách relatedIds, đặc biệt nếu tôi cần truy xuất tất cả các đối tượng mà các liên quan trỏ đến cùng một lúc (có thể là thông thường đối với tôi) – sanity

2

Đây không phải là cách tiếp cận tốt nhất để ánh xạ nhiều cho nhiều mối quan hệ trong Objectify. Cách tốt nhất là tạo một thực thể ánh xạ mối quan hệ. Ví dụ, giả sử bạn có hai đối tượng A và B và chúng được liên kết theo một cách nhất định. Họ có thể tạo một lớp học tương tự như:

Class Link{ 
    Key<?> master; 
    key<?> slave; 

    public Link(){ 

    } 

    public setLink(Entity master, Entity slave){ 
    //initialize 

    } 

} 

Sau đó, bạn có thể tạo một thực thể Liên kết để lập mô hình mối quan hệ. Điều này tự động ánh xạ từ một đến một hoặc nhiều mối quan hệ

1

Hãy suy nghĩ về một trong nhiều khoảnh khắc; nếu bạn muốn một đối tượng A đến "có nhiều" đối tượng Bs, chỉ có hai cách để làm điều đó:

  • The Way Relational: làm cho mỗi điểm B tại A. Khi bạn có A0 và muốn tất cả các B liên quan đến nó, chỉ cần truy vấn cho các B trỏ đến A0 đã cho.

  • Cách NoSQL/ObjectStore: tạo A có một trường chứa danh sách các con trỏ (Phím) cho B-s. Lưu ý rằng cách này cũng cho phép các B-s theo một thứ tự cụ thể (mặc dù tài liệu GAE/Java ngược lại.)

Điều nào là tốt nhất. Cách ObjectStore bị giới hạn bởi kích thước của một đối tượng. Cách quan hệ phụ thuộc vào một vấn đề tinh tế trong đó trừ khi A và tất cả các B trong cùng một nhóm thực thể và bạn thực hiện truy vấn tổ tiên trong một giao dịch (hoặc thậm chí nếu nó không có trong một giao dịch), bạn được đảm bảo để có được tất cả của các B trỏ đến A. Tuy nhiên nếu A và Bs span Entity Groups, có thể (mặc dù có lẽ không chắc) bạn sẽ nhận được B không thỏa mãn vị từ truy vấn, hoặc bỏ lỡ B : https://developers.google.com/appengine/articles/transaction_isolation

Trong (nay là tiêu chuẩn) cao Replication Datastore, giao dịch thường là hoàn toàn áp dụng trong vòng vài trăm mili giây sau khi cam kết lợi nhuận. Tuy nhiên, ngay cả khi không hoàn toàn áp dụng , các lần đọc tiếp theo, ghi và truy vấn tổ tiên sẽ luôn là phản ánh kết quả của cam kết, bởi vì các hoạt động này áp dụng bất kỳ sửa đổi nổi bật nào trước khi thực hiện.Tuy nhiên, các truy vấn trải rộng nhiều nhóm thực thể không thể xác định xem có bất kỳ sửa đổi nào chưa được thực hiện trước khi thực hiện và có thể trả về cũ hoặc kết quả được áp dụng một phần.

Giờ đây đối với nhiều người: Tôi đã đọc một câu chuyện khi mô tả đi vào nhà vệ sinh trong không gian; có bốn kết hợp: bên trong/bên ngoài một tàu không gian và hai loại đi vào nhà vệ sinh. Đối với sự kết hợp cuối cùng bên ngoài con tàu (trong bộ đồ không gian) và loại bỏ chất rắn, câu trả lời duy nhất là "không có cách nào duyên dáng" (cũng là tiêu đề của bài báo): http://settlement.arc.nasa.gov/CoEvolutionBook/SPACE.HTML#There Không phải là cách duyên dáng . .. và đó cũng là câu trả lời cho nhiều mối quan hệ trong GAE. Bạn có thể xây dựng chúng bằng cách sử dụng một lớp kết nối và mỗi bên của phép nối có thể được thực hiện với một truy vấn hoặc một danh sách các Phím.

2

Tôi đã giải quyết bằng phương pháp này với làm thành khách quan 4.0:

@Entity 
@Index 
public class Module { 

@Id 
private Long id; 
private String name; 

@Load 
private List<Ref<Template>> templates; 


public List<Template> getTemplates() { 
    List<Template> templates = new ArrayList<Template>(); 

    for (Ref<Template> temp : this.templates) { 
     templates.add(temp.get()); 
    } 

    return templates; 
} 

public void setTemplates(List<Template> templatesParm) { 
    List<Ref<Template>> templates = new ArrayList<Ref<Template>>(); 

    for (Template temp : templatesParm) { 
     templates.add(Ref.create(temp)); 
    } 

    this.templates = templates; 

} 
+0

Vì không có truy vấn như vậy trong objectify, Làm thế nào chúng ta có thể nhận được mẫu đơn liên kết với nhiều Module? –

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