2010-11-05 10 views
16

Tôi muốn làm mới một thực thể và tất cả các bộ sưu tập con của nó là gì. Cách tốt nhất để làm việc này là gì? Tôi đang nói về nhibernate :)Cách tốt nhất để làm mới các thực thể trong nhibernate

Tôi đã đọc về session.Evict, session.Refresh ...

Nhưng tôi vẫn không chắc chắn nếu làm như:

RefreshEntity<T>(T entity) 
{ 
session.Evict(entity); 
session.Refresh(entity); 
} 

sẽ làm việc chính xác cách tôi muốn nó hoạt động

Nó có hoạt động không? Nếu không, tôi có thể làm gì khác?

Trả lời

23

Làm mới sau khi Bị trục xuất có thể không hoạt động.

Về mặt lý thuyết, chỉ cần, Refresh là đủ. Tuy nhiên, nó đã được biết đến các vấn đề khi các yếu tố của bộ sưu tập trẻ em đã bị xóa.

Evict tiếp theo là Get thường hoàn thành công việc.

+0

Xin lỗi vì đã nói điều này nhưng điều đó không làm việc :(Nó hoạt động trong kịch bản này: 1) pEntity.pCollection trống 2) Tôi thêm một mục vào bộ sưu tập trong cơ sở dữ liệu bằng tay 3) Tôi có thể xem được cập nhật bộ sưu tập nhưng không hoạt động trong trường hợp này: 1) pEntity.pColelction có giá trị 2) Tôi thay đổi giá trị của một mục trong pEntity.pCollection theo cách thủ công trong cơ sở dữ liệu 3) sau khi làm mới tôi vẫn có các mục tương tự trong pEntity .pCollection ... – Katalonis

+1

Làm mới một mình sẽ hoạt động trong trường hợp đó ** nếu ** pCollection cascades. Nếu không, bạn phải tự làm mới các mục của nó. –

+0

'Làm mới' một mình dường như là đủ cho tôi cho cả hai bổ sung và loại bỏ vào một bộ sưu tập lười biếng trên một thực thể. Một liên kết đến bất kỳ vấn đề đã biết hoặc hãy cẩn thận sẽ hữu ích nếu có những trường hợp đặc biệt mà tôi cần biết. –

2

Làm mới (parentObject) sẽ là một lựa chọn tốt, nhưng đối với tôi, trước tiên, nó tìm nạp tất cả trẻ em một với yêu cầu duy nhất. Không có đợt, không có truy vấn phụ, không tham gia. Rất tệ!

Nó đã giúp. Xóa() bộ sưu tập con của đối tượng gốc; Tôi cũng đã đuổi các đồ vật trẻ em trước đó.

(những điều này đã được thay đổi bằng bản cập nhật HQL trước khi nhiều phụ trang của cha mẹ/con SaveOrUpdate sẽ gây dựng lại chỉ mục nhóm đắt tiền).

EDIT: Tôi đã xóa bản cập nhật HQL một lần nữa, vì truy vấn (chỉ số giảm dần theo số lượng lớn, độc nhất) đắt hơn hàng trăm bản cập nhật hàng đơn lẻ trong một lô. Vì vậy, tôi đã kết thúc trong một SaveOrUpdate đơn giản (parentObject), mà không cần phải làm mới.

Lý do là bộ sưu tập trẻ em có ràng buộc duy nhất trên ParentID và Index (số tuần tự), điều này sẽ dẫn đến vi phạm độc đáo trong khi cập nhật các mục con đã thay đổi. Vì vậy, chỉ số lần đầu tiên được tăng lên 1000000 (hoặc một số cao tùy ý) cho tất cả trẻ em, sau đó sau khi thay đổi, giảm đi một lần nữa.