2012-07-06 23 views
7

Tôi cần phải thực hiện truy vấn bên trong Transaction, tuy nhiên tôi không biết Entity @Id, những gì tôi có là giá trị của một trường, như tên người dùng nhưng không phải là ID,Chỉ truy vấn tổ tiên được cho phép bên trong giao dịch, làm thế nào để đối phó với nó?

Nói cách khác, Tôi không thể tạo Key để thực hiện truy vấn. Làm thế nào tôi có thể làm một truy vấn để có được một thực thể bên trong một Transaction?

+1

Như bạn biết bạn không thể làm điều đó. Nó có vẻ là một vấn đề thiết kế. Có thể bạn có thể thử hỏi câu hỏi này bằng những gì bạn đang cố gắng làm. – sahid

Trả lời

14

Nếu không tham gia vào các vấn đề thiết kế sâu hơn, có hai tùy chọn:

1) Chạy truy vấn bên ngoài giao dịch.

Phản đối (bạn gắn thẻ bài đăng này với) giúp dễ dàng thực hiện các truy vấn không giao dịch ngay cả khi bên trong giao dịch. Chỉ cần sinh ra một thể hiện ofy mới không liên kết với một giao dịch và sử dụng nó để chạy truy vấn ... sau đó quay trở lại làm việc trong giao dịch của bạn. Hãy ghi nhớ rằng điều này không thoát ra khỏi giao dịch và có thể có ảnh hưởng đến tính toàn vẹn của hoạt động. Thường thì nó không quan trọng.

Nếu bạn đang sử dụng Objectify4 bạn chỉ có thể chạy các hoạt động như thế này:

ofy.transactionless.load().type(Thing.class).filter("field", value)...etc 

2) Sử dụng một thực thể tra cứu

này thường là câu trả lời đúng khi đối phó với những thứ như tên người dùng. Tạo một thực thể riêng biệt mà bản đồ tên người dùng để đối tượng người dùng của bạn như thế này:

class Username { 
    @Id String username; 
    Key<User> user; 
} 

giao dịch Sử dụng XG để tạo ra một Tên đăng nhập mỗi khi bạn tạo một tài khoản, và cập nhật nó nếu bạn cho phép tên người dùng của bạn để thay đổi. Bây giờ, để thực hiện tra cứu giao dịch Người dùng theo tên người dùng, trước tiên hãy tra cứu Tên người dùng và sau đó sử dụng tên đó để tra cứu Người dùng.

+0

Tôi muốn sử dụng String Id, tôi ok cho nó cho ID người dùng tuy nhiên hwen tôi có một chuỗi ID đó là một chuỗi ngẫu nhiên, có lẽ có thể từ chuỗi ngắn đến chuỗi rất dài. Tôi có thể thấy khóa Datastore là "đầy hơi", ý tôi là, khóa GAE tỉ lệ với độ dài của @Id, làm cách nào tôi có thể xử lý được điều đó? – xybrek

+0

Nghe có vẻ như tối ưu hóa sớm. Tôi sẽ không lo lắng về điều này trừ khi bạn có kế hoạch lưu trữ petabyte. – stickfigure

+0

Phải, tuy nhiên điều này không làm giảm hiệu suất đến mức mà đọc/ghi sẽ mất nhiều thời gian hơn để cam kết? Nếu tôi không ổn với điều này. Tuy nhiên những gì tôi đang lo lắng về đơn đăng ký của tôi sẽ được lập hóa đơn như thời gian tính toán. Quá lâu đọc/ghi có nghĩa là đắt hơn? – xybrek

0

Tôi đã gặp sự cố tương tự và phương pháp đơn giản nhất mà tôi đã đưa ra là sử dụng một thực thể cha mẹ giả. Thay vì sử dụng các giao dịch XG và chèn một thực thể Tên người dùng khác cho mọi thực thể Người dùng khác, chỉ cần tạo một thực thể cha mẹ giả và đặt làm tổ tiên của mỗi thực thể Người dùng mà bạn tạo từ đó. Tôi nghĩ phương pháp này tiết kiệm rất nhiều vấn đề về quản lý dữ liệu và không gian.

+2

Hạn chế của việc này là tất cả các thực thể Người dùng đều kết thúc trong một nhóm thực thể và theo tài liệu bạn chỉ có thể viết 1 lần cho mỗi nhóm hoàn toàn: [Tài liệu Datastore] (https://cloud.google.com/ appengine/docs/python/datastore/structuring_for_strong_consistency? csw = 1) –

+0

Tôi không biết giới hạn đó. Cảm ơn đã chỉ ra điều đó. – kerafill

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