2013-06-08 33 views
5

Trong mối quan hệ Nhiều đến Nhiều giữa hai bảng với một bảng Bản đồ ở giữa, làm cách nào tôi chỉ có thể tải các id cho thực thể thứ hai.Làm cách nào để chỉ tải các id từ nhiều đến nhiều bảng ánh xạ?

Sau đây là ví dụ để giải thích những gì tôi muốn đạt được ở đây. Dưới đây là lược đồ mẫu

create table user(
id int PrimaryKey, 
name text 
) 
create table pages (
id int PrimaryKey, 
page_name text 
) 
create table user_page (
id_user int, 
id_page int, 
PrimaryKey (id_user, id_page) 
) 

Lưu ý: có các cột bổ sung trong bảng người dùng và trang mà tôi chưa bao gồm ở đây ngắn gọn.

tài thực thể:

@Entity 
@Table(name = "user") 
public class User { 
@id 
@column(name="id") 
private Integer id; 
@column(name="name") 
private String name; 
... 
... 
} 

@Entity 
@Table(name = "page") 
public class Page { 
@id 
@column(name="id") 
private Integer id; 
@column(name="page_name") 
private String name; 
... 
... 
} 

Những gì tôi muốn làm là thêm một thuộc tính Set<Integer> pageIds trong User lớp và có tất cả id trang ánh xạ cho một người sử dụng trong bộ sưu tập này.

Làm cách nào để thực hiện điều này bằng Hibernate?

Trả lời

11

Trong User lớp:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

Bạn có thể lấy id bằng cách duyệt qua các thiết lập trở lại. Theo các bộ sưu tập mặc định là lazily (nghĩa là chỉ id) được tải.

EDIT: Nếu bạn không muốn để lập bản đồ Page đối với một số lý do, bạn có thể sử dụng @ElementCollection như thế này:

@ElementCollection 
@CollectionTable(name="user_page", [email protected](name="id_user")) 
@Column(name="id_page") 
public Set<Long> pageIds; 
+1

Có cách nào tôi có thể tải chỉ Id trong một Set mà không sử dụng trang lớp học? tức là thêm thuộc tính khác Đặt vào Lớp người dùng có tất cả các id? –

+1

Đã cập nhật câu trả lời của tôi. – lunr

1

tôi gặp phải một vấn đề với các câu trả lời được chấp nhận, khi tôi muốn để lập bản đồ cả pagespageIds. Hibernate sẽ sử dụng cả hai trường này để thực hiện thay đổi đối với bảng ánh xạ khi một số User được lưu, có thể gây ra nhiều hành vi lạ.

tôi thay solved this bằng cách làm cho pageIds@Transient và Populating bộ sưu tập sử dụng @PostLoad:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

@Transient 
public Set<Long> pageIds; 

@PostLoad 
private void postLoad() { 
    pageIds = pages.stream().map(Page::getId).collect(Collectors.toSet()); 
}