2012-07-07 70 views
0

我试图在下面的类图中建模作业门户用例。我已经使Skill实体可以被工作以及希望重用的求职者共享。面向对象设计和休眠

我修改了我的oo设计,因为我分享了我认为它的M:N关系而不是1:N的技巧。

问题:

我怎样才能做到下面的事情使用休眠?我需要诉诸SQL吗?

  1. 因为Skill有M:N关系,它需要关联表JobSkill和SeekerSkill。如何创建工作或求职者实例,以便他们使用数据库中的现有技能?
  2. 我需要做的技能相匹配,使得职业技能的要求是候选的子集 技能:
    一)用人单位E1:找到所有候选人 - 1 {工作+ 1 {候选人} N}ñ
    二)候选人C1 :找到所有的工作 - 1 {工作+雇主} N

我想为这种情况添加一个业务服务类作为JobPortal与伪代码的一些方法。如果一个人能回答所需要的方法findJobsForSeeker HQL查询:

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 ? 
    } 

} 

回答

1

要回答你的第一个问题:你搜索你要附加到新的工作或导引头(带有HQL查询)的技能。一旦你找到了技巧,将它们添加到新的工作或求职者的技能集合:

List<Skill> skills = session.createQuery("select skill from Skill skill where ...") 
          .list(); 
for (Skill skill : skills) { 
    newJob.addSkill(skill); 
} 

我不明白你的第二个问题,使用的语法。如果你想找到谁在一组给定的技能,所有技能全部求职者:

select seeker from Seeker seeker where not exists (
    select skill.id from Skill skill where skill in (:skillSet) 
    and skill.id not in (select skill2.id from Seeker seeker2 
         inner join seeker2.skills skill2 
         where seeker2 = seeker)) 
+0

我从你了解到我需要找到持久的技能,并把它添加到工作/导引头。如果没有找到一些技能,那么将它们添加到求职者/求职者组合中可以适当地创建他们。该关系是M:N,因此它将根据配置在关联表中创建映射。你的第二个查询很好的学习如何使用HQL **,而不必像在原始sql中那样显式地处理关联表。 1 {x} N表示正则表达式中的重复像x {1,N}。谢谢。 – Miten 2012-07-08 07:13:42

+0

添加它们不会创建它们。你需要明确地调用persist()或save()。 – 2012-07-08 07:48:46

+0

**请看你是否可以写出与HQL中的求职者技巧相匹配的查询。求职者技能经验可以> =工作技能经验,以符合条件。**我需要每个技能比赛结果集中的员工,工作记录。结果可以由员工分组。后来我需要在关联表中取得经验属性而不是技能表。当我们添加新项目来设置它们被添加到项目表时,我认为M:N关系项目应该被添加到关联以及像1:N关系那样的技能表中? – Miten 2012-07-08 09:36:43

1

这是不完全清楚你问什么,但我会尝试添加一些更

1 )如果您的问题是如何映射实体进入休眠状态,可以使用ManyToMany和JoinTable注释查找

(http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping - 许多一对多-使用的注解 - 1.HTML)。

如果您创建实际的SeekerSkill实体(例如,一个搜索者有许多SeekerSkills,而一个技能有许多SeekerSkills),您还可以使用2 OneToMany建模ManyToMany关系。

如果你的问题是如何填充数据库中现有技能的工作/求职者 - 那么我只需编写一次性SQL脚本来填充具有适当技能(jobSkills和seekerSkills)的关联表。

2)检查子集的一种方法,假设求职者/求职者不会多次列出相同的技能,那就是加入技能,由求职者/求职者进行分组,并确保你得到适当的数量。

例如,
导引头 - 杰夫技能: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 
+0

**好的简单技巧来检查子集**如果将其转换为hql将会很好!谢谢。 – Miten 2012-07-08 07:18:06