2012-07-07 50 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