正常一对多
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;
}
}