2012-11-09 3 views
0

저는 JPA2, Unitils, jUnit + 다른 것들을 사용하고 있습니다.@ OneToOne- "not not null"과의 관계

@Entity 
public class CaseStuff implements Serializable { 
.... 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long caseStuffId; 

@OneToOne(mappedBy = "CaseStuff") 
private XCase xcase; 
... 
} 

@Entity 
public class XCase implements Serializable { 
.... 
@OneToOne 
@JoinColumn(name = "CASESTUFFID") 
private CaseStuff caseStuff; 
.... 
} 

두 테이블이 다른 테이블의 ID를 가지고, 그래서 그것은 또한 다른 방법으로 주위를 매핑 할 수 있습니다 : 내 문제는 두 엔티티에 관한 것이다. jUnit-Test에서 Unitils는 XCase없이 CaseStuff 레코드 하나를 삽입합니다. 나는 그것이 사실이라는 것을 확인했다. 는하지만, 나는 다음과 같은 쿼리를 사용

"select s from CaseStuff s where s.xcase is null" 

을는 0 CaseStuff 객체를 반환합니다. "is not null"을 사용하면 객체를 반환하지만 디버깅 중에 CaseStuff.xcase를 검사하면 null이됩니다.

어떤 아이디어입니까, 여기에 무슨 문제가 있습니까?

는 편집 : Hibernate에 의해 생성 된 SQL은

select 
    * 
from 
    CaseStuff casestuff0_ 
where 
    (
     casestuff0_.xcaseid is null 
    ) 

*로 * 모든 필드 이름을 대체 변환

EDIT2 : 나는 OneToOne-관계로 변경하기 전에, 그것은 불필요한 ManyToOne는 했다 . 이전에 JUnit 테스트는 s.xcase 아직 설정되어있는 경우로이 여전히 어떤 이유로 제대로 작동 쿼리

"select s from CaseStuff s where not exists (select x from s.xcase x)" 

했다.

나와 함께 알아 내려고 모든 사람에게 감사드립니다.

+0

최대 절전 모드로 실행되는 정확한 SQL보기를 참조하십시오. –

+0

좋은 생각이지만 흥미로운 것은 없습니다 (편집 참조). – Thomas

+0

데이터베이스를 확인하고 테이블 행에 실제로 삽입 된 값을 볼 수 있습니까? – remigio

답변

0

당신이 당신의 엔티티를 정의 된대로 ID가 Xcase ID로 외래 키로 caseStuff_id (또는 다른 이름)가 윌의 옆에 Xcase는 외래 키

그래서 Xcase 테이블이됩니다. 이 이미지처럼

귀하의 경우 사람에

enter image description here

이 Xcase이다 (이름의 추상화를 만드는)와 CaseStuff는가에 의해 생성 된 경우 PersonDetails

그래서 아마 당신에게 CaseStuff 테이블

(이다 지속성 공급자는 사례 ID가 없음

구조적으로 말해서 테이블이 정의 된 방법을 확인하려면 db 수준을 확인하십시오.

+0

테이블이 지속성 공급자에 의해 생성되지 않았습니다. 위에서 언급했듯이 테이블에는 서로 ID가 있지만 엔티티는 서로를 객체로 유지합니다. – Thomas

+0

그러면 양방향 관계가 없으며, 단방향 1 대 1 관계가 있습니다. 에 의해 매핑 된 사용하지 마십시오 ... 모두에 대한 JoinColumn 사용 – Cris