在我的项目中,我正在使用 Spring Data JPA ,并为我的数据获取类扩展了JpaRepository接口。
OrganizationMaster类:
@Entity
@Table(name="organization_master")
public class OrganizationMaster {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="organization_id")
private int organizationId;
@OneToMany(mappedBy="organizationMaster")
private List<CompanyMaster> companyMasters;
}
CompanyMaster班级:
Entity
@Table(name="company_master")
public class CompanyMaster {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="company_id")
private int companyId;
@ManyToOne
@JoinColumn(name="organization_id")
private OrganizationMaster organizationMaster;
}
我的控制器
@RequestMapping(value = "/GetOrganization", method = RequestMethod.GET)
public
@ResponseBody
List<OrganizationMaster> getOrganization(){
return organizationService.getOrganization();
}
OrganizationService:
public interface OrganizationService {
List<OrganizationMaster> getOrganization();
}
OrganizationServiceImpl:
@Service
public class OrganizationServiceImpl implements OrganizationService{
@Autowired
private OrganizationDao organizationDao;
@Override
public List<OrganizationMaster> getOrganization() {
return organizationDao.findAll();
}
}
OrganizationDao界面:
public interface OrganizationDao extends JpaRepository<OrganizationMaster,Long> {
}
我的输出响应为: [{“ organizationId”:5,“ companyMasters”:[{“ companyId”:29},{“ companyId”:30}]}]]
但我的需要是 [{“ organizationId”:5}]
当我尝试使用 findall()方法从组织母版获取数据时,它也会根据关系从公司母版获取数据。如何使用Spring数据JpaRepository
来实现延迟获取(仅从组织主获取数据)答案 0 :(得分:1)
所有XToOne关联都是默认的EAGER。您具有双向关系,因此应在 @ManyToOne 端使用 FetchType.LAZY 。
@ManyToOne(fetch = FetchType.LAZY)
此外,如果在序列化时使用任何序列化程序(例如json序列化程序),它将调用getter方法,这可能会导致不必要地加载惰性项目。
另一个考虑因素是使用Lombok时, @Data 注释会导致不需要的时候加载懒惰的项目。因此在使用Lombok时要小心。
因此,在您的情况下,由于您返回了实体本身,而在进行序列化时,它也对子级进行了序列化,因此导致加载懒惰的子实体。
您需要返回仅代表您的父实体的dto,以防止子实体的序列化。如果使用getter方法调用child,则会从数据库中懒散地填充子实体。
看看更多的信息关联:
https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/
答案 1 :(得分:-1)
我相信这个问题已经问过了!您可以使用以下注释:
@OneToMany(fetch = FetchType.LAZY)
请阅读这篇文章,以更好地了解这一点:
https://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/