面向对象设计与hibernate
我已经尝试在下面的类图中对作业门户用例进行建模。我已经使技能实体既可供求职者共享,也可供希望重用的求职者共享 我已经修改了我的oo设计,因为我分享了这个技能,我想这意味着它的M:N关系,而不是1:N关系面向对象设计与hibernate,hibernate,ooad,Hibernate,Ooad,我已经尝试在下面的类图中对作业门户用例进行建模。我已经使技能实体既可供求职者共享,也可供希望重用的求职者共享 我已经修改了我的oo设计,因为我分享了这个技能,我想这意味着它的M:N关系,而不是1:N关系 (修改为M:N与技能的关系) (与技能的关系为1:N) 问题: 如何使用hibernate执行以下操作?我需要求助于SQL吗 由于技能具有M:N关系,因此需要关联表JobSkill和SeekerSkill。如何创建求职者实例,以便他们使用数据库中现有的技能 我需要做技能匹配,这样工作技能要求
- (修改为M:N与技能的关系)
- (与技能的关系为1:N)
a) 雇主e1:找到所有候选人-1{job+1{candidate}N}N
b) 候选人c1:找到所有工作-1{工作+雇主}N
public class JobPortal {
public int createEmployer(String name, Address address) {
Employer e = null;
HBUtil.create(e = new Employer(name, address));
return e.getId();
}
public void addJobToEmployer(int empid, String jobName, String[][] skills) {
Employee e = HBUtil.get(empid, Employee.class);
Job j = new Job(jobName);
Skill s = null;
for(int i=0; i<skills.length; i++) {
s = HBUtil.find(skills[i][0], skills[i][1], Skill.class);
if (null == s) {
s = new Skill(skills[0], Interger.parseInt(skills[1])); //name, experience
}
j.add(s);
}
e.add(j);
HBUtil.save(e);
}
public int createSeeker(String name) {
Seeker s = null;
DBUtil.create(s = new Seeker(name));
return s.getId();
}
public void addSkillsToSeeker(int sid, String[][] skills) {
Seeker seeker = HBUtil.get(sid, Seeker.class);
for(int i=0; i<skills.length; i++) {
s = HBUtil.find(skills[i][0], skills[i][1], Skill.class);
if (null == s) {
s = new Skill(skills[0], Interger.parseInt(skills[1])); //name, experience
}
seeker.add(s);
}
HBUtil.save(seeker);
}
public void findJobsForSeeker(int sid) {
//what HQL do use ?
}
}
公共类JobPortal{
public int createEmployer(字符串名称、地址){
雇主e=零;
HBUtil.create(e=新雇主(姓名、地址));
返回e.getId();
}
public void addJobToEmployer(int-empid,String-jobName,String[]]skills){
Employee e=HBUtil.get(empid,Employee.class);
作业j=新作业(作业名称);
技能s=null;
for(int i=0;i回答第一个问题:搜索要附加到新工作或求职者的技能(使用HQL查询)。找到技能后,将其添加到新工作或求职者的技能集合中:
List<Skill> skills = session.createQuery("select skill from Skill skill where ...")
.list();
for (Skill skill : skills) {
newJob.addSkill(skill);
}
现在还不完全清楚你在问什么,但我会尝试补充一些
1) 如果您的问题是如何在hibernate中映射实体,那么可以使用ManyToMany和JoinTable注释进行查找
(http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html)
如果您创建了一个实际的SeekerSkill实体(例如,一个SeekerSkill拥有多个SeekerSkills,而一个Skill拥有多个SeekerSkills),您还可以使用2个OneToMany对多个关系进行建模
如果您的问题是如何用数据库中现有的技能填充求职者,那么我只需编写一个一次性SQL脚本,用适当的技能(jobSkills和seekerSkills)填充我的关联表
2) 假设工作/求职者不会多次列出同一技能,检查子集的一种方法是加入技能,按工作/求职者分组,并确保获得适当的计数
例如,
Seeker-jeff拥有以下技能:java、web开发、设计
工作-工作需要技能:java、设计
杰夫正在寻找与其技能相匹配的工作
这是SQL,因此必须将其转换为HQL
select job_id from job_skill
inner join seeker_skill on job_skill.skill = seeker_skill.skill
where seeker_id = :seeker_id // this is a var for jeff's id
group by job_id
having count(*) > :num_required_skills // in our case, 2
我从您那里了解到,我需要找到持久性技能并将其添加到求职者。如果没有找到几个技能,那么将它们添加到求职者集中将适当地创建它们。关系为M:N,因此它将根据配置在关联表中创建映射。您的第二个查询非常好地学习了如何使用HQL我们可能需要像在原始sql中那样显式地处理关联表。1{x}N意味着重复,就像正则表达式中的x{1,N}。谢谢。添加它们不会创建它们。您需要显式地调用persist()或save()。请查看您是否可以在HQL中编写将工作技能与求职者技能匹配的查询。求职者技能经验可以>=工作技能经验才能获得资格。我需要员工,每个技能匹配的结果集返回的工作记录。结果可以按员工分组。稍后我需要在关联表中设置经验属性,而不是skill表。我认为对于M:N关系,项目应该被添加到关联和技能表中,就像在1:N关系中,当我们添加新项目时,它们被添加到项目表中?如果它转换为hql,检查子集的简单技巧会很好!谢谢。
select job_id from job_skill
inner join seeker_skill on job_skill.skill = seeker_skill.skill
where seeker_id = :seeker_id // this is a var for jeff's id
group by job_id
having count(*) > :num_required_skills // in our case, 2