Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Data conditionally fetch children

I've read Spring Data JPARepository: How to conditionally fetch children entites. But I want to use convenient JPA annotations rather than manual join all children.

Say I have the following Model:

@Entity
public class UserModel extends BaseModel<User> {

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<CredentialModel> credentialList = new ArrayList<>();

    @ManyToMany
    @JoinTable(
            name = "users_actions",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "action_id", referencedColumnName = "id")
    )
    private List<ActionMode> actionList = new ArrayList<>();
}

Fetching credentialList and actionList can be a time consuming operation (join fetches, etc). I do not want to auto fetch credentialList nor actionList . But when I access them, I expect them to be an empty List rather than LazyInitializationException.

Can I use the fields even when I did not specifically JOIN FETCH them in @Query. Just leave it to be an empty list.

If not, Is there anyway to achieve same needs?

like image 405
Qiaosen Huang Avatar asked Mar 05 '17 13:03

Qiaosen Huang


1 Answers

Returning empty Collections would lead to a problem: You couldn't distinguish between a really empty collection and one, that just isn't lazily loaded. You could check for the collections before accessing them through org.hibernate.Hibernate.isInitialized(...) or PersistenceUnitUtil#isLoaded(...) in JPA2.

However I would suggest you to use Data-Transfer-Objects at this point. For the special use-case, where the collections are not needed, just build a similiar copy of your entity without that unnesseccary properties. Of course your DTO building must be done within an open session.

like image 126
SCI Avatar answered Sep 30 '22 11:09

SCI