dorado 解决加载数据时一对多把所有一的多全部加载的问题

本文介绍了Dorado框架中一对多数据加载的问题及解决方案。针对正常一对多关系,详细阐述了立即加载和延迟加载两种方式,并特别讨论了特殊一对多情况下的加载差异,强调了如何避免加载所有一对一关联数据的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常一对多

sl_message表有个外键,关联到sl_employee表 所以sl_employee是一,sl_message是多
@Entity
@Table(name = "sl_employee")
public class SlEmployee implements Serializable {
	public void setSlMessageSet(Set<SlMessage> slMessageSet) {
		this.slMessageSet = slMessageSet;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "slEmployee")
	public Set<SlMessage> getSlMessageSet() {
		return slMessageSet;
	}
}

@Entity
@Table(name = "sl_message")
public class SlMessage implements Serializable {
	public void setSlEmployee(SlEmployee slEmployee) {
		this.slEmployee = slEmployee;
	}
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "sender")
	public SlEmployee getSlEmployee() {
		return slEmployee;
	}
}

1.立即加载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.延迟加载

主要:把SlEmployee【DataType】下的slEmployeeSet【propertyDef】变成slEmployeeSet【reference】,其他不变
在这里插入图片描述

对于model下的DataType下的Reference中使用$${this.id},this表当前的DataType,$${this.id}表动态获取当前DataType的id字段【上图中表示当前SlEmployee的id】

@Component
public class MessageService {
    @Resource
    private SlMessageDao slMessageDao;
   
    @DataProvider
    public void getMessageByEmployeeId(Page<SlMessage> page, Integer employeeId){
    	//此时SlMessage表中有外键sender关联到SlEmployee的employeeId字段,但是Hibernate在生成实体类时,没有sender属性,有slEmployee【SlEmployee类型】,所以使用SlMessage中的slEmployee的employeeId代替sender进行查询
        String hql = "from SlMessage where slEmployee.employeeId = ?";
        slMessageDao.find(page,hql,employeeId);
    }
}

特殊一对多

部门下有部门,SlDept同时是一也是多

@Entity
@Table(name = "sl_dept")
public class SlDept implements Serializable {
	//sl_dept
	private SlDept slDept;
	//sl_dept
	private Set<SlDept> slDeptSet = new HashSet<SlDept>(0);
	public void setSlDept(SlDept slDept) {
		this.slDept = slDept;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "parent_id")
	public SlDept getSlDept() {
		return slDept;
	}
	public void setSlDeptSet(Set<SlDept> slDeptSet) {
		this.slDeptSet = slDeptSet;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "slDept")
	public Set<SlDept> getSlDeptSet() {
		return slDeptSet;
	}
}

1. 与正常一对多的加载区别

1. Model下的DataType【SlDept】下的slDeptSet可以是PropertyDef或Reference,来分别进行立即加载和延迟加载 2. 与正常一对多加载区别:slDeptSet的Datatype是[SELF]

2.延迟加载

在这里插入图片描述

CREATE TABLE `sl_dept` (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `dept_name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`dept_id`),
  KEY `fk_parent_id` (`parent_id`),
  CONSTRAINT `fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `sl_dept` (`dept_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
@DataProvider
	public Collection<SlDept> getDeptByParentId(Integer parentId) {
		if(parentId !=null) {
		//此时SlDept表中有外键parentId关联到自己表的成员变量deptId,但是Hibernate在生成实体类时,没有成员变量parentId,有成员变量slDept【SlDept类型】,所以使用SlDept中的slDept的deptId代替parentId进行查询
			String hql = "from SlDept where slDept.deptId=?";
			return slDeptDao.find(hql,parentId);
		}else{
			return null;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值