2013-06-22 49 views
0

如何定義2個類之間的關係One-to-One?在概念上,我認爲我在某個地方出了問題。我不知道是什麼,但它是。一對一映射的概念。解釋映射

讓我們假設有一個名爲CountryPM兩類:

Country 
    int c_id 
    String name_c 

PM 
int c_id 
String name_pm 

現在對於一個國家只能有一個PM和PM只能屬於一個國家。我如何在我的映射文件中執行此操作?

我是想這樣的:

<class name="pojo.Country" table="country"> 
     <id name="c_id"> 
      <generator class="increment" /> 
     </id> 
     <property name="name_c" /> 
     <one-to-one class="pojo.PM" name="name_pm" /> 
    </class> 

    <class name="pojo.PM" table="pm"> 
     <id name="c_id"> 
      <generator class="increment" /> 
     </id> 
     <property name="name_pm" /> 
    </class> 

但這筋疲力盡映射確實沒有什麼比在運行time.It說,物業name_pm不能Country類中被發現產生異常!但它是否在Country類中搜索。它應該搜索PM課程。

也幫我完成了我的one-to-one這兩個類之間的映射。我一直在嘗試這一段時間。

Java代碼:

國家

public class Country { 
    private int c_id; 
    private String name_c; 

    public int getC_id() { 
     return c_id; 
    } 

    public void setC_id(int c_id) { 
     this.c_id = c_id; 
    } 

    public String getName_c() { 
     return name_c; 
    } 

    public void setName_c(String name_c) { 
     this.name_c = name_c; 
    } 

} 

PM

public class PM { 
    private int c_id; 
    private String name_pm; 

    public int getC_id() { 
     return c_id; 
    } 

    public void setC_id(int c_id) { 
     this.c_id = c_id; 
    } 

    public String getName_pm() { 
     return name_pm; 
    } 

    public void setName_pm(String name_pm) { 
     this.name_pm = name_pm; 
    } 

} 
+0

這並不是因爲一個國家的有效例子不必有PM。在一對一映射中**一個集合中的每個**元素都與另一個元素的唯一元素相關聯。 –

回答

2

的問題是在你的XML映射和Java代碼之間的關係。

如果指定

<one-to-one class="pojo.PM" name="name_pm" /> 

這裏需要一個字段在Country POJO命名爲 「name_pm」。

你沒有這樣的領域。

如果您的Country類具有相應PM對象的字段,則應在此處使用該字段的名稱。

如果兩個類都沒有引用另一個,則需要添加一個。

我可能會對你的代碼做的事是向國家添加一個字段並在映射中使用它的名字。

public class Country { 
    private int c_id; 
    private String name_c; 
    private PM c_pm; 

    public int getC_id() { 
     return c_id; 
    } 

    public void setC_id(int c_id) { 
     this.c_id = c_id; 
    } 

    public String getName_c() { 
     return name_c; 
    } 

    public void setName_c(String name_c) { 
     this.name_c = name_c; 
    } 

    public PM getC_pm() { 
     return c_pm; 
    } 

    public void setC_pm(PM c_PM) { 
     this.c_pm = c_pm; 
    } 

} 

映射:

<class name="pojo.Country" table="country"> 
     <id name="c_id"> 
      <generator class="increment" /> 
     </id> 
     <property name="name_c" /> 
     <one-to-one class="pojo.PM" name="c_pm" /> 
</class> 

免責聲明:

我沒有測試過任何這一點,我不知道究竟是如何映射應該與共享來完成首要的關鍵。如果其他人想提供測試版本,我會很樂意提出另一個答案,或者讓這個人變成「社區wiki」。

+0

增加了java代碼 – saplingPro

+0

我不明白,除了我需要'name_pm'來消除異常。你能解釋一下,如何進行一對一的映射 – saplingPro

+0

沒問題。它可以工作。謝謝 – saplingPro

2

如果你的問題的一部分也是「......我想我錯了某個地方,概念上......」,我想提供一些解釋。

首先,One-to-One意味着,該引用位於對象(實例)之間。換言之,必須從一個對象到另一個對象的引用。不僅共同的簡單類型(即String name_pmString name_c

這兩個對象應該相互引用:

public class PM { 
    private Country country; // reference to an instance of the PM 
    ... 
} 

public class Country { 
    private PM pm; // reference to an instance of the Country 
    ... 
} 

在一個DB水平,這是更麻煩一點。因爲參考文獻是基於ID列的,我們向我們保證,這兩個Country-PM將始終屬於一起,因此我們必須重用ID值。

因此,一個對象將扮演主人的角色,例如,國家和第二個將根據它分配其ID。如果我們不會遵循這種模式,我們不能確定,遲早會出現一些many-to-onemany-to-many的關係。

這就是爲什麼映射通常是這樣的

<class name="pojo.Country" table="country"> 
    <id name="c_id"> 
     <generator class="increment" /> 
    </id> 
    <property name="name_c" /> 
    <one-to-one class="pojo.PM" name="pm" cascade="save-update" /> 
</class> 

<class name="pojo.PM" table="pm"> 
    <id name="pmid" type="java.lang.Integer"> 
     <column name="c_id" /> 
     <generator class="foreign"> 
      <param name="property">country</param> 
     </generator> 
    </id> 
    <one-to-one name="country" class="pojo.Country" constrained="true" /> 
</class> 

但一到一個映射真的是很特殊的。我想,PM方面的多對多映射(國家編號參考數據庫)可能更適合。這是不同的方法在所有,但...

請嘗試看看這個漂亮的文章:

+0

我們可以在這裏討論@ http://chat.stackoverflow.com/rooms/32215/discussion-between-radim-kohler-and-saplingpro – saplingPro

+1

+1:我相信有可能實現單向一對一,但雙向通常更好,這是一個很好的解釋。 –

+0

@DonRoby非常感謝。我開始寫下來,當你的回答要求提供更多信息時......我花了一點時間;)+1給你! –