OO设计和休眠

时间:2012-07-07 06:49:31

标签: hibernate ooad

我试图在下面的类图中为作业门户网站用例建模。我已经让Skill实体既可以分享工作,又可以寻找可以重复使用的求职者。

我已经修改了我的oo设计,因为我正在分享技能,我认为它意味着它的M:N关系而不是1:N。

的问题:

如何使用hibernate进行以下操作?我需要求助于SQL吗?

  1. 由于技能具有M:N关系,因此需要关联表JobSkill和SeekerSkill。如何创建作业或搜索者实例,以便他们使用数据库中的现有技能?
  2. 我需要进行技能匹配,以便工作技能要求是候选人的子集 技能:
    a)雇主e1:找到所有候选人 - 1 {job + 1 {candidate} N} N
    b)候选人c1:找到所有工作 - 1个{工作+雇主} N
  3. 我正在考虑为这个案例添加一个业务服务类作为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 ? 
      }
    
    }
    

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

你所要求的并不完全清楚,但我会尝试添加更多

1)如果你的问题是如何在hibernate中映射实体,你可以使用ManyToMany和JoinTable注释查找

(http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html)。

如果你创建一个真正的SeekerSkill实体(例如,一个搜索者有很多SeekerSkill,一个技能有很多SeekerSkill),你也可以使用2个OneToMany建模ManyToMany关系。

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

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

例如,
搜索者 - 杰夫有技能:java,web开发,设计
工作 - 工作需要技能:java,design

杰夫正在寻找与他的技能相匹配的工作

这是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