面向对象设计与hibernate

面向对象设计与hibernate,hibernate,ooad,Hibernate,Ooad,我已经尝试在下面的类图中对作业门户用例进行建模。我已经使技能实体既可供求职者共享,也可供希望重用的求职者共享 我已经修改了我的oo设计,因为我分享了这个技能,我想这意味着它的M:N关系,而不是1:N关系 (修改为M:N与技能的关系) (与技能的关系为1:N) 问题: 如何使用hibernate执行以下操作?我需要求助于SQL吗 由于技能具有M:N关系,因此需要关联表JobSkill和SeekerSkill。如何创建求职者实例,以便他们使用数据库中现有的技能 我需要做技能匹配,这样工作技能要求

我已经尝试在下面的类图中对作业门户用例进行建模。我已经使技能实体既可供求职者共享,也可供希望重用的求职者共享

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

  • (修改为M:N与技能的关系)
  • (与技能的关系为1:N)
问题:

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

  • 由于技能具有M:N关系,因此需要关联表JobSkill和SeekerSkill。如何创建求职者实例,以便他们使用数据库中现有的技能
  • 我需要做技能匹配,这样工作技能要求是候选人的子集 技能:
    a) 雇主e1:找到所有候选人-1{job+1{candidate}N}N
    b) 候选人c1:找到所有工作-1{工作+雇主}N
  • 我正在考虑为本例添加一个业务服务类作为JobPortal,其中包含一些方法,如下面的伪代码所示。如果可以回答方法findjobsforseek所需的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 ? 
      }
    
    }
    
    公共类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