Tôi hiện đang chuyển một ứng dụng (đang hoạt động) từ EclipseLink sang Hibernate JPA, chủ yếu là nó khá trơn tru, nhưng tôi đang tìm một thứ mà tôi không thể giải thích, và cũng có thể không nghĩ đến bất kỳ cụm từ tìm kiếm nào tốt!Hibernate JPA - Quan hệ ManyToOne không phổ biến
Về cơ bản, tôi có bốn đơn vị, với các mối quan hệ một-nhiều tạo thành một chuỗi:
EntityA có một danh sách các EntityB, mỗi trong số đó có một danh sách các EntityC, mỗi trong số đó có một danh sách EntityD của
mỗi người sau đó có nhiều-một mối quan hệ đi theo cách khác, vì vậy:
EntityD có EntityC, trong đó có một EntityB, trong đó có một EntityA.
Đó là (chủ yếu giảm cho rõ ràng):
@Entity
public class EntityA {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityA")
private List<EntityB> entityBList;
...
}
@Entity
public class EntityB {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityB")
private List<EntityC> entityCList;
@JoinColumn (name = "ENTITY_A", referencedColumnName = "ENTITY_A_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityA entityA;
}
@Entity
public class EntityC {
@OneToMany (cascade = CascadeType.ALL, mappedBy = "entityC")
private List<EntityD> entityDList;
@JoinColumn (name = "ENTITY_B", referencedColumnName = "ENTITY_B_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityB entityB;
}
@Entity
public class EntityD {
@JoinColumn (name = "ENTITY_C", referencedColumnName = "ENTITY_C_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityC entityC;
}
tôi nhận được một EntityA từ cơ sở dữ liệu (nhìn nó lên bằng cách khóa chính của nó), và do đó có một trường hợp EntityA độc đáo dân cư, với một PersistentBag cho của tôi List<EntityB>
. Tôi thấy một tải chậm xảy ra khi tôi dereference rằng List<EntityB>
, và lặp đi lặp lại cùng nhau để nhận EntityCs từ EntityB. Tại thời điểm này, mọi thứ như tôi mong đợi, tôi có một EntityA, B và C tất cả được điền đầy đủ với các giá trị từ cơ sở dữ liệu, nhưng sau đó tôi cố gắng lấy EntityD của mình, từ EntityC, và thấy rằng nó không có giá trị.
Người quản lý đối tượng của tôi vẫn mở và hoạt động tại thời điểm này, và ngay cả khi tôi xem nó trong trình gỡ rối ngay sau khi nhận được EntityA, tôi có thể đi qua các mối quan hệ, đến tận EntityC, và một lần nữa xem 'entityDList 'là null.
Giải pháp duy nhất tôi đã tìm thấy cho đến nay là sử dụng:
EntityManager.refresh(entityC);
mà populates tất cả các yếu tố của nó bao gồm một PersistentBag lười biếng-nạp cho entityDList. Vì vậy, tôi đoán là Hibernate chỉ điền các tham chiếu 2 cấp độ sâu (hoặc 3, tùy thuộc vào cách bạn đếm), và từ bỏ sau đó, mặc dù tôi không thực sự hiểu tại sao điều đó sẽ xảy ra. cái đó có phù hợp với ai không?
Có giải pháp nào khác ngoài .refresh không? Một số loại cấu hình hoặc giá trị chú thích mà sẽ làm cho Hibernate cư các tài liệu tham khảo tất cả các con đường xuống?
Giá trị được đặt cho thông số cấu hình ngủ đông "max_fetch_depth" là gì? –