2013-06-22 3 views
0

두 클래스 사이에 One-to-One 관계를 정의하는 방법은 무엇입니까? 나는 어딘가에서 개념적으로 잘못 될 것이라고 생각한다. 나는 무엇인지 모르지만 그것은 그렇다. 일대일 매핑의 개념입니다. 매핑을 설명하십시오

Country 
    int c_id 
    String name_c 

PM 
int c_id 
String name_pm 

이제 하나 개의 국가, 하나의 PM이있을 수 있으며, 오후는 한 나라를 속할 수 있습니다 :

은 우리가 CountryPM라는 두 개의 클래스가있는 가정하자. 매핑 파일에서이 작업을 어떻게 수행합니까?

<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_pmCountry 클래스 안에서 발견 할 수 없다고하는 동안 예외를 생산하는 것보다 아무것도하지 않는다 :

나는이 시도되었다! 하지만 Country 클래스 안에서 검색합니까? 오히려 PM 클래스 내에서 검색해야합니다.

또한 두 개의 클래스간에 내 one-to-one 매핑을 수행하는 데 도움이됩니다. 나는 이것을 얼마 동안 시도해왔다.

자바 코드 :

나라

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; 
    } 

} 

오후

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 매핑 및 자바 코드 사이의 관계에있다.

를 지정하면

필드가 Country POJO에 "name_pm"라는 이름이 필요하다
<one-to-one class="pojo.PM" name="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> 

면책 조항 :

나는이 중 하나를 테스트하지 않았습니다, 나는 매핑이 공유와 함께 할 수 있어야 정확하게 방법을 잘 모르겠어요 기본 키. 다른 사람이 테스트 된 버전을 제공하는 것처럼 느낀다면 기꺼이 다른 대답을 업 보봇 트하거나 "커뮤니티 위키"를 돌려 보겠습니다.

+0

자바 코드를 추가했습니다 – saplingPro

+0

예외를 제거하기 위해'name_pm'이 필요하다는 것을 제외하고는 이해하지 못했습니다. 'one-to-one'매핑이 어떻게 수행되는지 설명해주십시오. – saplingPro

+0

좋습니다. 작동합니다. 감사합니다. – saplingPro

2

질문의 일부도 "... 나는 어딘가에 잘못 생각하고 있다고 생각합니다. 개념적으로 ..."몇 가지 설명을하고 싶습니다.

우선, One-to-One은 참조가 객체 (인스턴스) 사이에 있다는 것을 의미합니다. 다른 말로하면 한 객체에서 다른 객체로의 참조가 있어야합니다. 뿐만 아니라 일반적인 단순 유형 (즉 String name_pm 또는 String name_c)

두 개체가 서로를 참조해야하십시오 DB 수준에

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 
    ... 
} 

, 그것은 조금 더 까다 롭습니다. 참조는 ID 열을 기반으로하고 있으므로이 두 Country-PM은 항상 함께 속할 것이므로 ID 값을 다시 사용해야합니다.

이렇게 하나의 객체가 마스터의 역할을 수행합니다. 국가와 두 번째 국가는 ID를 기반으로 ID를 할당합니다. 우리가 그 패턴을 따르지 않는다면, 조만간에 many-to-one 또는 many-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> 

그러나 일대일 매핑과 같은 이유

는 그리고 정말 아주 특별하다입니다. DB에있는 국가 id 참조를 사용하여 PM 측에 다 대다 매핑을하는 것이 더 적합 할 것 같아요. 그것은 ... 전혀 다른 접근이지만,

이 좋은 문서를 참조 해보세요 : 그것은 국가 때문에 유효한 예가 아니다

+0

우리는 여기서 논의 할 수 있습니다. @http : //chat.stackoverflow.com/rooms/32215/discussion-between-radim-kohler-and-saplingpro – saplingPro

+1

+1 : 단방향 일대일을 구현하는 것이 가능하다고 믿습니다. , 그러나 일반적으로 양방향성이 더 좋으며 이것은 좋은 설명입니다. –

+0

@DonRoby 정말 고마워. 나는 당신의 대답이 더 많은 정보를 요구할 때 그것을 적어 쓰기 시작했다 ... 그것은 나에게 조금 나중에 걸렸다;) 당신에게도 +1! –

관련 문제