6

Trước hết, có, tôi đang sử dụng DistinctRootEntityResultTransformer.Bản sao khi háo hức tìm nạp tham chiếu (nhiều-một)

tôi có như sau (thành thạo NHibernate) lập bản đồ:

public FirstObjectMap() 
{ 
    Id(x => x.Id): 
    HasMany<SecondObject>(x => x.SecondItems).KeyColumn("FirstObject_ID"); 
} 

public SecondObjectMap() 
{ 
    Id(x => x.Id).Column("ID"); 
    References(x => x.ThirdObject).Column("ThirdObject_ID"); 
} 

public ThirdObjectMap() 
{ 
    Id(x => x.Id).Column("ID"); 
    HasMany<D>(x => x.FourthItems).KeyColumn("ThirdObject_ID"); 
} 

public FourthObjectMap() 
{ 
    Id(x => x.Id).Column("ID"); 
} 

Thông báo, rằng SecondObject đề cập đến ThirdObject (nghĩa là mấu chốt là trên SecondObject).

truy vấn của tôi trông như thế này:

var query = session.CreateQuery("select distinct first from " + 
    "FirstObject as first " + 
    "left join fetch first.SecondItems as second " + 
    "left join fetch second.ThirdObject as third " + 
    "left join fetch third.FourthItems as four where ..."); 

// This is not even needed as I'm using distinct in HQL 
query.SetResultTransformer(new DistinctRootEntityResultTransformer()); 

var results = query.List<ReinsurableObject>(); 

Để thử nghiệm, tôi có 1 FirstObject, 1 SecondObject, 1 ThirdObject và 24 FourthObjects trong cơ sở dữ liệu. Truy vấn SQL trả về 24 hàng như được yêu cầu.

Tuy nhiên, đây là nhược điểm: NHibernate tạo:

1 FirstObject 
    24 SecondObject (should be 1) 
    24 x 1 ThirdObject (should be 1) 
     24 x 1 x 24 FourthObject (should be 24) 

Vì vậy, NH cho bất cứ lý do tạo ra 24 SecondObject thay vì 1.

Tôi đoán nó không biết làm thế nào để lập bản đồ "tham gia fetch "(bên trái hoặc bên trong dường như không quan trọng) để tham khảo (tham chiếu đến ThirdObject trong SecondObject).

Tùy chọn của tôi là gì? Tôi không thể thay đổi mô hình dữ liệu, nhưng tôi cần phải háo hức tải tất cả.

Cảm ơn trước!

Trả lời

4

Thực thể gốc riêng biệt chỉ hoạt động nếu bạn tải cha mẹ và con. Đối với cháu và cháu ngoại, điều này không có tác dụng. Vấn đề là bạn đang tải nhiều liên kết bộ sưu tập và trả lại một số lớn cartesian product

Vui lòng đọc điều này article by Ayende giải thích tại sao đây là trường hợp và giải pháp thay thế.

Điều gì đó có thể không rõ ràng ngay lập tức sẽ dẫn đến kết quả là sản phẩm Descartes. Điều này được chỉ ra trong số documentation, nhưng tôi nghĩ rằng tất cả chúng ta đều có thể đồng ý rằng mặc dù có thể có lý do cho hành vi này, điều này rất xa lý tưởng.

+1

Theo như tôi biết, sản phẩm Descartes chỉ xảy ra khi tham gia các liên kết song song. Ví dụ, nếu A có B1 và ​​B2 thì điều đó sẽ dẫn đến sản phẩm Descartes. Ayende cho thấy trong blog của mình exacly rằng tình hình (từ Blog b trái tham gia lấy b.Posts trái tham gia lấy b.Users). Nhưng nếu A, B, C, D là phân cấp (như tôi có), chúng không được tạo ra một sản phẩm Descartes. Vấn đề mà tôi đang phải đối mặt là tôi có hệ thống phân cấp nhiều-một, nhiều-một, một-nhiều. Phải không? – user315648

+0

Không, tôi không tin rằng điều này là đúng bạn đang tải nhiều -> một -> nhiều -> một. Nhìn vào SQL được tạo ra và chạy điều này đối với cơ sở dữ liệu để xem điều gì đang xảy ra – Rippo

+0

Mối quan hệ thứ 3 đến thứ 4 của nó gây ra nhiều liên kết thu thập do đó tạo ra 24 đối tượng thứ hai – Rippo

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