2011-09-11 1 views
2

나는 일대일 관계로 클래스를 가졌습니다. 기본적으로 "클래스 A"에는 "클래스 B"와 일대일 관계가 있습니다. 이 관계는 기본 키 조인 열을 사용합니다. 이제는 내 문제는 다음과 같습니다. A의 인스턴스를 만들면 B 인스턴스를 추가하지 않았기 때문에 저장할 수 없습니다. 그러나 B의 인스턴스를 만들지는 않습니다. 왜냐하면 먼저 A의 ID가 필요하기 때문입니다.치킨 또는 달걀 타입 최대 절전 모드 매핑 문제

쉬운 해결책은 B의 ID를 자동으로 생성하는 것이므로 A 인스턴스를 만들기 전에 B의 인스턴스를 만들 수 있습니다. 그러나이 작업을 수행하는 더 좋은 방법이있을 것이라고 확신합니다. ? :)

hibernate가 외래 키 제약 조건 인 추측 인 A의 id 열에 추가 색인을 만들었다는 것을 데이터베이스에서 볼 수 있습니다. 그리고 일대일 매핑의 XML 버전에 관계가 제한되는지 여부를 지정하는 속성이있는 문서를 볼 수는 있지만 @OneToOne 주석은이 옵션을 갖고 있지 않습니까? : S

당신이 AB 테이블 간의이 개 관계를 보인다

답변

2

(당신이 :; Bb_id, a_id을 가지고 Aa_id, b_id있다). one to one을 모델링하려면 하나의 관계 만 필요합니다. '기본'테이블을 확인한 다음 '보조'테이블에서 열을 드롭합니다 (Aa_id, b_id, Bb_id). 그 후 최대 절전 모드 (및 다른 스키마 클라이언트)는 B 테이블을 참조하여 A으로 먼저 B에 삽입 할 수 있습니다.

예를 들어, 달걀과 닭고기. 알과 닭 간에는 여러 가지 관계가 있습니다 (닭 한 마리는 많은 알을 낳을 수 있고, 한 알은 닭 한 마리를 생산할 수 있습니다). 따라서 one to one 관계의 달걀 생산 닭에 대해서는 열을 chicken 표에 두는 것이 합리적입니다. 따라서 달걀이 먼저 생성되고 그 다음 그 달걀을 참조하여 닭이 만들어 질 수 있습니다.

Hibernate 매핑처럼 볼 수 있었다 다음

@OneToOne(mappedBy = "parentEgg") 
public Chicken getChildChicken() { 
    return childChicken; 
} 

업데이트 :

같은 일이 같은 계란 클래스에서

@OneToOne 
@JoinColumn(name = "parent_egg_id") 
public Egg getParentEgg() { 
    return parentEgg; 
} 

: 치킨 클래스에서

xml에서 0, optional 속성이 OneToOne 인터페이스에서 가능합니다. 기본적으로 true로 설정되어 있으므로 관계는 기본적으로 nullable입니다.

/** 
    * (Optional) Whether the association is optional. If set 
    * to false then a non-null relationship must always exist. 
    */ 
    boolean optional() default true; 

귀하의 의견에 따르면 A 행이 먼저 삽입됩니다. 나는 B에서 A에서 B 사이가 아닌 A에 의존하는 것을 고려할 것입니다. 이 경우 A에 항목을 작성하려면 B에 두 개의 insert 문이 필요합니다 (A에서 B까지 - 추가 update A 진술이 필요합니다).

+0

안녕하세요, 답변 해 주셔서 감사합니다.하지만 A와 B 사이에는 두 가지 관계가 없습니다. A에는 a_id가 있고 B에는 b_id가 있습니다.내 게시물에서 언급했듯이 실제로 B를 먼저 삽입하고 ID를 가져 와서 A를 만드는 데 사용할 수 있습니다. 실제로 OneToOne 속성을 nullable로 설정하는 방법을 알고 싶습니다. 먼저 A를 만들 수 있습니다. B :) – JustDanyul

+0

기본적으로 Null 값입니다. 답변의 업데이트 섹션을 참조하십시오. – Andrey

+0

답변을 주셔서 다시 한 번 감사드립니다. 해결되었습니다. 나는 문제가 내가 A에서 B로 외래 키 contraint를 만드는 것 같다 PrimaryKeyJoinColumn을 사용하고 있었다 :) 도움을 주셔서 감사합니다 :) – JustDanyul