繁体   English   中英

如何使用Spring Data JPA实现延迟加载?

[英]How to achive lazy loading using spring data jpa?

在我的项目中,我正在使用Spring Data JPA,并为我的数据获取类扩展了JpaRepository接口。

组织硕士班:

  @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;
    }

公司硕士班:

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实现延迟获取( 仅从组织主获取数据

所有XToOne关联都是默认的EAGER。 您具有双向关系,因此应在@ManyToOne端使用FetchType.LAZY

@ManyToOne(fetch = FetchType.LAZY)

另外,如果在序列化时使用任何序列化器(如json序列化器),它将调用getter方法,这可能会导致不必要地加载惰性项目。

另一个考虑因素是在使用Lombok时,@ Data注释会导致无需加载懒项。 所以在使用龙目岛时要小心。

因此,在您的情况下,由于您返回了实体本身,而在序列化时它也对子项进行了序列化,因此导致加载懒散的子项实体。

您需要返回仅代表您的父实体的dto,以防止子实体的序列化。 如果使用getter方法调用child,则会从​​数据库中懒散地加载子实体。

查看更多信息关联:

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

我相信这个问题已经问过了!您可以使用以下注释:

@OneToMany(fetch = FetchType.LAZY)

请阅读此文章以更好地了解这一点:

https://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM