[英]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.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.