如何使用spring data jpa实现延迟加载?

时间:2018-11-28 06:20:59

标签: java spring-boot spring-data-jpa

在我的项目中,我正在使用 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

来实现延迟获取(仅从组织主获取数据)

2 个答案:

答案 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/