2012-05-08 32 views
5

Tôi đang sử dụng phiên bản phát triển cục bộ của việc triển khai JDO của App Engine. Khi tôi truy vấn một đối tượng có chứa các đối tượng khác như các trường được nhúng, các trường được nhúng được trả về là rỗng.Trường JDO được nhúng không được truy vấn bằng truy vấn

Ví dụ, cho phép nói đây là đối tượng chính mà tôi đang kiên trì:

@PersistenceCapable 
public class Branch { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

và điều này đối tượng nhúng của tôi:

@PersistenceCapable(embeddedOnly="true") 
public class Address { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

đoạn mã sau không lấy đối tượng nhúng:

PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager(); 

    Branch branch = null; 
    try { 
     branch = pm.getObjectById(Branch.class, branchId); 
    } 
    catch (JDOObjectNotFoundException onfe) { 
     // not found 
    } 
    catch (Exception e) { 
     // failed 
    } 
    finally { 
     pm.close(); 
    } 

Có ai có giải pháp cho việc này không? Làm thế nào tôi có thể lấy đối tượng Branch cùng với trường Address được nhúng của nó?

Trả lời

8

Tôi đã gặp sự cố tương tự và nhận thấy rằng các trường được nhúng không được bao gồm trong nhóm tìm nạp mặc định. Để có trường được yêu cầu được tải, bạn sẽ phải gọi hàm getter cho nó trước khi đóng trình quản lý lưu giữ lâu bền hoặc đặt nhóm tìm nạp để tải tất cả các trường.

Điều này có nghĩa như sau ...

branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is null 

branch = pm.getObjectById(Branch.class, branchId); 
branch.getAddress(); // this is not null 
pm.close(); 
branch.getAddress(); // neither is this 

Vì vậy, bạn sẽ cần phải thay đổi mã của bạn như sau:

Branch branch = null; 
try { 
    branch = pm.getObjectById(Branch.class, branchId); 
    branch.getAddress(); 
} 
catch (JDOObjectNotFoundException onfe) { 
    // not found 
} 
catch (Exception e) { 
    // failed 
} 
finally { 
    pm.close(); 
} 

Ngoài ra, bạn có thể thiết lập lấy bạn nhóm bao gồm tất cả các lĩnh vực như sau ...

pm.getFetchPlan().setGroup(FetchGroup.ALL); 
branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is not null 
+0

Cảm ơn câu trả lời nhanh chóng! Tôi sẽ kiểm tra điều này và cho bạn biết nếu nó hoạt động. – Chania

+0

Nếu một trường nằm trong nhóm tìm nạp hiện hoạt thì rõ ràng nó nên được tìm nạp. Nếu bạn nói nó không phải là sau đó tại sao không cung cấp một testcase đơn giản và báo cáo nó tại http://code.google.com/p/datanucleus-appengine/issues/list Không báo cáo nó có khả năng có nghĩa là không ai tham gia vào dự án sẽ biết về nó – DataNucleus

+0

Tôi không chắc đây có phải là lỗi hay một phần của đặc tả JDO hay không. Tôi nhớ đọc ở đâu đó rằng việc tải các trường nhúng vào trong các thông số JDO, nhưng tôi không thể tìm thấy nó ngay bây giờ. – Cengiz

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