How to load only ids from Many to Many mapping tables?

Salman A. Kagzi picture Salman A. Kagzi · Jun 8, 2013 · Viewed 7.1k times · Source

In a Many to Many relation between two table with a Mapping table in between, how can I only load ids for the second entity.

Following is the example to explain what I want to achieve here. Below is a sample schema

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

Note: there are additional columns in user and page tables which i have not included here for brevity.

User entity:

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

What I want to do is add another attribute Set<Integer> pageIds in User class and have all page ids mapped for a user in this collection.

How can this be done using Hibernate?

Answer

lunr picture lunr · Jun 9, 2013

In User class:

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

You can get the id's by iterating over the returned set. By default collections are lazily (i.e. only ids) loaded.

EDIT: If you don't want to map Page for some reason, you can use @ElementCollection like this:

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