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 encountered a problem with the accepted answer, when I wanted to map both pages
and pageIds
. Hibernate will use both of these fields to make changes to the mapping table when a User
is saved, possibly causing a lot of weird behaviour.
I instead solved this by making pageIds
@Transient
and populating the collection using @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());
}
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;