背景
环境
相关环境配置:
-
SpringBoot+PostGreSQL
-
Spring Data JPA
懒加载现象
首先声明一下 application.yml 文件中关于 JPA 的配置:
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: none
open-in-view: false
properties:
hibernate:
order_by:
default_null_ordering: last
order_inserts: true
order_updates: true
generate_statistics: false
jdbc:
batch_size: 5000
复制代码
因某些原因,无法直接贴出相关代码,这里就贴一下自己构建的类似代码:
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class User extends BaseDomain {
private String name;
private Integer age;
private String address;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List<Job> jobs = new ArrayList<>();
}
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class Job extends BaseDomain {
private String name;
@ManyToOne
@JoinColumn
private User user;
private String address;
}
复制代码
自定义查询语句如下:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@EntityGraph(
attributePaths = {"jobs"}
)
List<User> findByAddress(String address);
}
复制代码
当我们在 Service 服务中调用类似 findByAddress()的查询方法,断点调试发现查询结果有点意思,明明数据已经能拉出来了,但是在 Hibernate Interceptor 中,并未复制给对应的属性。其次,可以看到得到的对象并不是真正的实体对象,而是实体的代理。
我们来对比一个正常的调用:
很明显,这里返回了想要的结果,而异常的则没有,而