Hou*_*dri 13 java spring hibernate spring-data-jpa spring-boot
我在谷歌上搜索了很多,Spring Boot(最新版本)可能没有延迟加载不起作用,这真的很奇怪。以下是我的代码片段:
我的资源:
public ResponseEntity<Page<AirWaybill>> searchAirWaybill(CriteraDto criteriaDto, @PageableDefault(size = 10) Pageable pageable{
airWaybillService.searchAirWaybill(criteriaDto, pageable);
return ResponseEntity.ok().body(result);
}
Run Code Online (Sandbox Code Playgroud)
我的服务:
@Service
@Transactional
public class AirWaybillService {
//Methods
public Page<AirWaybill> searchAirWaybill(AirWaybillCriteriaDto searchCriteria, Pageable pageable){
//Construct the specification
return airWaybillRepository.findAll(spec, pageable);
}
}
Run Code Online (Sandbox Code Playgroud)
我的实体:
@Entity
@Table(name = "TRACKING_AIR_WAYBILL")
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@airWaybillId") //to fix Infinite recursion with LoadedAirWaybill class
public class AirWaybill{
//Some attributes
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FK_TRACKING_CORPORATE_BRANCH_ID")
private CorporateBranch corporateBranch;
}
Run Code Online (Sandbox Code Playgroud)
并且在调试时,我仍然会加载所有延迟加载的属性。见下图。
我的问题之一是杰克逊会参与这种行为吗?有什么方法我可能错过了激活延迟加载?
编辑
另一个问题,调试器是否会参与破坏延迟加载?
编辑2:
对于规范构建,我有:
public static Specification<AirWaybill> isBranchAirWayBill(long id){
return new Specification<AirWaybill>() {
@Override
public Predicate toPredicate(Root<AirWaybill> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.equal(root.join("corporateBranch",JoinType.LEFT).get("id"),id);
}
};
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*cki 13
Hibernate Session 存在于方法中@Transactional
。在 Service 类之外传递实体是一种不好的做法,因为在离开您的search
方法后会话将被关闭。另一方面,您的实体包含延迟初始化的集合,一旦会话关闭就无法拉出。
好的做法是将实体映射到传输对象并从服务中返回这些传输对象(而不是原始实体)。
很可能您仍在服务内部进行调试,因此当事务仍然处于活动状态时,可以触发延迟加载(在延迟元素上调用的任何方法都会触发从数据库中获取)。
问题是在事务之外时不能发生延迟加载。杰克逊正在解析您的实体,绝对超出了实体的边界。
您应该在构建规范时获取所有必需的依赖项,或者@Transactional
在资源级别尝试使用(但作为最后的手段尝试)。
只是为了让您知道,LAZY 获取策略只是一个提示.. 不是强制性操作。渴望是强制性的:
LAZY 策略是对持久性提供程序运行时的一个提示,即在第一次访问数据时应该延迟获取数据。允许实现急切地获取已为其指定 LAZY 策略提示的数据。
归档时间: |
|
查看次数: |
21136 次 |
最近记录: |