首页 > 解决方案 > Spring boot 2.0.4.RELEASE fetch 默认情况下

问题描述

我正在将 Spring Boot 与 JPA(休眠)一起使用,在我转向 Spring Boot 之前,我将 Spring Data JPA 与休眠一起使用,默认值是急切地加载属性值并懒惰地加载集合。

在 Spring Boot JPA 中,默认情况下会急切地获取以下内容,为什么?角色将在用户内部返回,但它们应该为空

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;

这就是我遵循的示例https://medium.com/@gustavo.ponce.ch/spring-boot-spring-mvc-spring-security-mysql-a5d8545d837d

我编辑的 application.properties 如下:

# ===============================
# = JPA / HIBERNATE
# ===============================
spring.jpa.show-sql = true
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

# ==============================================================
# = Spring Security / Queries for AuthenticationManagerBuilder
# ==============================================================
spring.queries.users-query=select email, password, active from user where email=?
spring.queries.roles-query=select u.email, r.role from user u inner join user_role ur on(u.id=ur.user_id) inner join role r on(ur.role_id=r.id) where u.email=?

==================================================== ========================== 我试图在用户实体中添加这个关系:

@Entity
@Table(name = "user")
@Getter
@Setter
public class User {

    @OneToMany(mappedBy = "user")
    private List<Test> tests;
}

测试将在此热切地获取:

@Transactional
@Override
public List<User> getAllUsers() {
        List<User>users=userRepository.findAll();
    return users;
}

我找不到为什么这是默认而不是延迟加载。

标签: javaspringspring-bootjpa

解决方案


你误会了。默认情况下,每个以结尾的映射toMany都是延迟获取的。
从 Spring 源文件复制:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface ManyToMany {

    // rest of the annotation properties are omitted for better readability

    FetchType fetch() default LAZY;
}

推荐阅读