2012-02-20 28 views
12

Tôi đang gặp một số vấn đề khi nhận được liên kết hai chiều hai chiều hoạt động với JoinTables. Đây là những gì tôi nhận:hai chiều một chiều có thể nối với nhau

Class A:

@OneToMany 
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

Class B:

@ManyToOne 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)}, 
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)}) 
public A getA() { 
    return a; 
} 

Nếu tôi tạo ra một thể hiện của A và B, thêm trường hợp của B đến A và lưu lại. Nó hoạt động. Nhưng khi tôi tải lại thể hiện của A và thử truy cập tập hợp các Bs nó ném một LazyInitializationError với thông báo "truy cập bất hợp pháp để tải bộ sưu tập".

Tôi sẽ làm gì sai ở đây? :) Ai có thể chỉ cho tôi một ví dụ về hiệp hội hai chiều sử dụng bảng kết hợp. Và nơi mà quyền sở hữu được giữ cho lớp A, tôi đã tìm kiếm mặc dù tài liệu ở hibernate.org nhưng tôi không thể tìm thấy nó.

-Daniel

+0

Tại sao bạn sử dụng bảng nối khác trong thực thể có nguồn gốc của bạn (B)? – Perception

+0

xin lỗi, tôi đã cập nhật câu hỏi. Lý do là tôi đã sửa đổi hai lớp thực tế cho ví dụ (đổi tên thành A và B về cơ bản :)) – JustDanyul

+0

Ok. Vui lòng thêm lỗi bạn đang gặp phải vào câu hỏi. – Perception

Trả lời

7

lập bản đồ của bạn là đúng đắn và đó là lý do tại sao sự xâm nhập là nhận được lưu trong cơ sở dữ liệu. Vấn đề trong tìm nạp là vì số Lazy Initialization.

Để giải quyết nó thay đổi bản đồ của lớp A như,

@OneToMany(fetch=FetchType.LAZY) 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

này sẽ cháy một truy vấn bổ sung cho các bảng B và khởi tạo bộ sưu tập. Nó có thể ảnh hưởng đến hiệu suất tùy thuộc vào không có mục trong bảng bị đơn của bạn.

Đọc API here để biết thêm thông tin.

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