java - 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;
}
我找不到为什么这是默认而不是延迟加载。
解决方案
你误会了。默认情况下,每个以结尾的映射toMany
都是延迟获取的。
从 Spring 源文件复制:
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface ManyToMany {
// rest of the annotation properties are omitted for better readability
FetchType fetch() default LAZY;
}
推荐阅读
- javascript - Javascript/Typescript:如何在深度嵌套的 javascript 数组中设置一个已知属性
- docker - 从主机访问在 docker 上运行的服务器
- javascript - javascript fetch() arrayBuffer 行为奇怪
- python - 具有来自分类器的预测值的数据框
- c++ - 我不确定为什么会收到此错误:“C++ 没有运算符与这些操作数匹配,操作数类型是:设置
= 设置 " - ios - 如何在使用 UIpageviewcontroller 导航页面时从另一个视图控制器自动更新视图控制器上的标签
- c# - MediatR 错误:向容器注册您的处理程序
- python - 如何以编程方式在 python 中录制窗口/GUI 应用程序?
- r - 如何将 XML 文件转换为 R 中的数据框/小标题?
- python - python泡菜的局限性?它可以序列化任何东西吗?