繁体   English   中英

Spring 引导 - 使用通用 DAO 实现在一对多关系中加载父实体记录

[英]Spring Boot - Load parent entity record in 1 To Many relationship using Generic DAO Implementation

在我的 spring-boot 应用程序(使用休眠)中,对于实体上的简单 CRUD,我有一个具有创建、更新、读取、删除方法的通用 DAO 实现。 我的问题是关于读取功能的——我不能在有关系的实体上使用通用读取方法。 在通用 DAO 实现中这样做,子对象(配置了延迟加载)也会被填充。

通用HibernateDaoImpl.java

    public class GenericHibernateDaoImpl<T, PK extends Serializable> implements IGenericDao<T,PK>{
       // including only my read method
       @Override
       public T read(Class<T> t, int id) {
           String _query = String.format("SELECT r FROM %s r WHERE Id= %s",t.getName(),""+id);
           return (T) getSession().createQuery(_query, t).getSingleResult();
       }
    }

当我想查询没有关系的简单表时,以上内容对我有帮助。

在我想 select 数据库记录而不加载其子项的情况下(在 1..M 关系但仅返回父项的情况下),我使用如下非泛型类型(因为如果我在这种情况下使用上述 class ,它从关联表中提取所有数据):

SalePlanDao.java - 在这里我可以得到父记录

public class SalePlanDao implements IGenericDao<FFMSalePlan, Serializable> {
   @Override
   public FFMSalePlan read(Class<FFMSalePlan> t, int id) {
       String _query = String.format("SELECT r FROM %s r WHERE Id= %s",t.getName(),""+id);
       FFMSalePlan _mmSalePlan = (FFMSalePlan) getSession().createQuery(_query, t).getSingleResult();
       return _mmSalePlan;
   }
}

当我调用 SalePlanDao.read 时,它现在只返回父记录而不是它的子记录(延迟加载)。

我希望能够从 GenericHibernateDaoImpl.java 等通用读取方法中仅加载片段 2 中的父实体。 这样,我可以在整个项目中保留 1 个这样的方法,并且只有在需要孩子时,才调用一个单独的 DAO,该 DAO 调用了 Hibernate.Initialize(etc)。

我假设启用延迟加载的字段在通用实现中被“触及”,因此它也在子表上调用选择。

我的问题更多是“如何设计它”,而不是我面临的任何技术问题/错误。 如何实现对具有关系的实体的通用读取以仅返回父记录?

实体

  • FFMSalePlan - 父表
  • FFTSalePlan - 子表

FFMSalePlan.java

public class FFMSalePlan implements Serializable {
   //other fields
    @JsonProperty("detail")
    @OneToMany(mappedBy = "mSalePlan", orphanRemoval = true)
    @Cascade({CascadeType.ALL})
    private Set<FFTSalePlan> tSalesPlan;
}

FFTSalePlan.java

public class FFTSalePlan implements Serializable {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "i_saleplan_id", referencedColumnName = "i_id" )
    private FFMSalePlan mSalePlan;
}

如果我是你,我不会编写通用逻辑或使用Hibernate.initialize来初始化关系。 Usually, the way to go is using entity graphs in a Spring Data repository: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-graph

处理获取的另一种方法是使用 DTO 或投影。 您可以查看 Spring 数据投影,但我认为这是Blaze-Persistence Entity Views的完美用例,它类似于 Spring 数据投影,但远远超出了基本内容并且性能更好。

Spring 数据集成让您几乎可以像 Spring 数据投影一样使用它: https://persistence.blazebit.com/documentation/entity-view/manual-html/。

暂无
暂无

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

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