2011-03-13 5 views
1

최대 절전 모드를 배우고 있으며 일대일 무 지향성 매핑이 혼란 스럽습니다.왜 일대일 단방향 매핑이 존재합니까?

예 : 한 남편의 아내 한 명과 그 반대의 경우.

wife.java :

@Entity 
public class Wife { 
    private int id; 
    private String name; 

    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
} 

Husband.java는 :

@Entity 
public class Husband { 
    private int id; 
    private String name; 
    private Wife wife; 
    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 
    @OneToOne 
    @JoinColumn(name="wifeId") 
    public Wife getWife() { 
     return wife; 
    } 
} 

이 일대일 undirectional (외래 키) 매핑입니다.

지금 내 질문은 :

이 질문이 있습니다. 한 남편이 한 명의 아내 만 가질 수 있도록하려면 어떻게해야합니까?이 소송에서 한 명 이상의 남편이 같은 아내를 가질 수 있습니다.

남편과 아내 사이에는 제약이 없습니다.

그래서 문제가 무엇인지 궁금합니다.

답변

3

관계가 선택 사항 인 경우 (예 : 아내가 null 일 때), Hibernate는 기본적으로 외래 키에 대한 고유 컨트 롤을 생성하지 않습니다. 그러나 @JoinColumn(..., unique = true)을 사용하여 제한 조건을 만들 수 있습니다 (null 입력 가능 열의 고유 제한 조건이 DB2 또는 Ingres와 같이 예상대로 작동하지 않는 DBMS를 사용하지 않는 한).

필요한 관계의 최대 절전 모드가 자동으로 고유 제한 조건을 작성합니다

@OneToOne(optional = false) 
@JoinColumn(name="wifeId") 
public Wife getWife() { 
    return wife; 
} 

고유 제약 조건이 일대일 관계를 적용, 그것은 독특한 wifeId의이 모든 남편을 필요로하기 때문에, 따라서 다른 아내를 참조하도록해야합니다.

0

wifeId 열에 고유 제한 조건을 적용하여 아내 당 남편이 한 명만있을 수 있습니다. 어느 쪽이든 당신은 스키마를 생성하는 최대 절전 모드를 사용하는 경우, 귀하의 JoinColumn 주석에 속성 unique="true"을 추가, 데이터베이스에 직접 넣어 또는 매핑의 JoinColumn 그의 아내에 대한 식별자를 포함하는 남편 테이블의 열을 의미

+0

"고유 한"의미는 다음과 같습니다. 남편 테이블에있는 아내는 고유해야합니다. 그렇다면 한 남편이 남편의 소유자 일 수는 있지만 남편이 아내 한 명을 남기려면 어떻게해야합니까? 나는 일대일 one-to-many와 many-to-many ...에 의존하고있다. : (그리고, 데이터베이스를 직접 수정하는 것이 좋은가요? 매핑 파일에 제약이없는 것은 어떨까요? 계단식 문제가 생길지 모르지? – hguser

0

아내 테이블. 이 열은 남편 표에 나타나므로 남편 기록마다 아내 열에 하나의 식별자 만 저장할 수 있으므로 아내가 한 명만있을 수 있습니다. 그러나 이것은 여성이 다른 남편과 결혼하는 것을 암묵적으로 막지는 않습니다 : D. 너 자신을 돌봐 줘야 해. 내 생각에, 고유 제한 조건은 남편 테이블의 두 레코드가 동일한 아내 아이디를 가질 수 없지만, 애플리케이션 관점에서 남편 오브젝트를 추가하거나 업데이트하기 전에 검사를 실시해야합니다.