首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OO设计与hibernate

OO设计与hibernate
EN

Stack Overflow用户
提问于 2012-07-07 06:49:31
回答 2查看 201关注 0票数 0

我尝试过像下面的类图那样对作业门户用例进行建模。我已经使技能实体,作为共享的工作,以及求职者,希望重用。

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

  • http://imagebin.org/219822 (修正为M:N与技能的关系)
  • http://imagebin.org/219680 (老1:N与技巧的关系)

问题:

我如何使用hibernate来做下面的事情?我需要求助于SQL吗?

  1. 由于since具有M:N关系,因此需要关联表JobSkill和SeekerSkill。如何创建就业或求职者实例,以便他们使用数据库中的现有技能?
  2. 我需要进行技能匹配,以便工作技能要求是候选人技能的子集: ( a)雇主e1:查找所有候选人- 1{job +1{候选人}N } ( b)候选人c1:找到所有工作-1{就业+雇主}N

我正在考虑为本例添加一个Business类,作为JobPortal,并使用下面的伪代码中的一些方法。如果可以回答方法findJobsForSeeker所需的HQL查询

代码语言:javascript
运行
复制
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 ? 
  }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-07 12:08:45

要回答你的第一个问题:你寻找你想要附加到新工作或求职者的技能(通过HQL查询)。一旦你找到了这些技能,你就把它们添加到新工作或求职者的技能集合中:

代码语言:javascript
运行
复制
List<Skill> skills = session.createQuery("select skill from Skill skill where ...")
                            .list();
for (Skill skill : skills) {
    newJob.addSkill(skill);
}

我不明白你在第二个问题中使用的语法。如果你想找到所有在某一套技能中具备所有技能的求职者:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-07-07 14:11:40

还不完全清楚你在问什么,但我会再补充一些

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

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

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

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

2)一种检查分类的方法,假设工作/求职者没有不止一次列出相同的技能,那就是加入一项技能,按求职者/求职者分组,并确保你得到了适当的计数。

例如,

探索者-杰夫拥有以下技能: java,web开发,设计

工作- jobA需要技能: java,设计

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

这是SQL,所以您必须将其转换为HQL。

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11372926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档