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

前端 未结 2 987
时光说笑
时光说笑 2020-12-30 04:35

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

相关标签:
2条回答
  • 2020-12-30 05:01

    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());
    }
    
    0 讨论(0)
  • 2020-12-30 05:03

    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;
    
    0 讨论(0)
提交回复
热议问题