如何只从多个映射表加载ID到多个映射表?

时间:2013-06-08 13:30:03

标签: hibernate hibernate-mapping hibernate-annotations

在两个表之间有多对多关系的映射表之间,我怎样才能为第二个实体加载id。

以下是解释我想在这里实现的内容的示例。 以下是示例模式

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)
)

注意:用户和页面表中还有其他列,为简洁起见,我未在此处包含这些列。

用户实体:

@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;
 ... 
 ...
}

我想要做的是在Set<Integer> pageIds类中添加另一个属性User,并为此集合中的用户映射所有页面ID。

如何使用Hibernate完成这项工作?

2 个答案:

答案 0 :(得分:19)

User课程中:

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

您可以通过迭代返回的集合来获取id。默认情况下,集合是懒惰的(即只有ids)。

编辑:如果您由于某种原因不想映射Page,可以像这样使用@ElementCollection

@ElementCollection
@CollectionTable(name="user_page", joinColumns=@JoinColumn(name="id_user"))
@Column(name="id_page")
public Set<Long> pageIds;

答案 1 :(得分:0)

当我想同时映射pagespageIds时,我遇到了接受答案的问题。当保存User时,Hibernate将使用这两个字段对映射表进行更改,这可能会导致很多奇怪的行为。

我通过pageIds @Transient代替solved this并使用@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());
}