2016-02-21 76 views
0

我試圖實現一個one to onehibernate關係mapping,我是新的休眠技術。我的兩個實體類是EmployeeClient。客戶端應該有一個employee ID列作爲數據庫表中的外鍵;即this客戶由this僱員處理。現在有兩個jsp頁面,通過它我將提交員工和客戶的詳細信息。首先,我將添加/提交員工jsp。然後在客戶端jsp頁面上會有一個選擇框,其中包含employeeIDs作爲其值。我做了我的jsp部分。但我懷疑我與客戶之間的一對一映射關係。所以我提供了我的代碼文件。下面是我的代碼:如何在休眠模式下實現一對一的外鍵關係映射

員工類:

public class RWEmp { 
    private int id; 
    private String strName; 
    private String strContactNum; 
    private String strDateOfJoining; 
    private String strDesignation; 
    public RWEmp(){ 
    } 
    // getter/setters 
} 

客戶端類:

public class RWClient { 
    private int id; 
    private String strName; 
    private RWEmp poc_emp; // point of contact employee as employee object 
    public RWClient(){ 
    } 
    // getter/setters 
} 

employee.hbm.xml是直線前進。即沒有關係。 但是客戶端與僱員對象有一個has a關係。

client.hbm.xml:

<hibernate-mapping> 
    <class name="com.rightwave.entities.RWClient" table="client_master"> 
     <id name="id" type="int"> 
      <generator class="increment" /> 
     </id> 
     <property name="strName" type="string" column="cl_name" /> 
     <many-to-one name="poc_emp" class="com.rightwave.entities.RWEmp" column="poc_emp" unique="true"></many-to-one> 
    </class> 
</hibernate-mapping> 

堅持類:

public class PersistEntities { 

    public void clientPersist() { 
     Session session=Factory.getSession(); 
     Transaction tr=session.beginTransaction(); 

     RWEmp rwEmp =new RWEmp(); 
     rwEmp.setId(2); // this will come from jsp page <select> value. I am doubtful of this, explained below in question. 

     RWClient rwClient1=new RWClient("wso2",rwEmp); 

     session.save(rwClient1); 
     session.flush(); 
     tr.commit(); 
     session.close(); 
    } 
} 

在這裏,我不知道這藍圖是對還是錯。我可以設置員工ID,該ID將來自我的客戶端jsp頁面(從<select>框中)。我很困惑,因爲在這裏我只設置了員工ID,這個ID必須已經存在才能成爲客戶的有效外鍵。但是沒有驗證該員工ID是否已經存在的檢查。在客戶端對象之前,Employee對象肯定會被保存(從employee.jsp)。我做對了嗎?

+0

我相信你可以用你當前的代碼保存'rwClient1'。但是,如果在jsp顯示之後但在保存'rwClient1'之前,帶有id 2的'rwEmp'會從其他操作(jsp)中刪除,那該怎麼辦?這是你問的場景嗎?並且爲什麼你有'unique ='true''多對一',因爲一個員工ID可以分配給多個客戶? –

+0

是的,它正在被保存。是的,我同樣關心你在這裏提到的有關如果在保存rwClient1之前刪除empID 2會發生什麼情況。有人告訴我,'unique = true'是一對一的關係。我需要:一個員工ID只能分配給一個客戶。 – JPG

+0

這裏最好的辦法是什麼? – JPG

回答

0

當與兩個實體建立一對一關係時,兩個實體都被分配相同的主鍵。應在0​​表中聲明特殊的外部標識符生成器,​​以從Employee表中獲取主鍵值。添加constrained="true"以確保Employee存在。

<hibernate-mapping> 
    <class name="com.rightwave.entities.RWClient" table="client_master">   
     <id name="id" type="java.lang.Integer"> 
      <column name="ID" /> 
      <generator class="foreign"> 
       <param name="property">poc_emp</param> 
      </generator> 
     </id> 
     <one-to-one name="poc_emp" class="com.rightwave.entities.RWEmp" 
      constrained="true"></one-to-one> 
     <property name="strName" type="string" column="cl_name" />   
    </class> 
</hibernate-mapping>