2014-06-21 3 views
3

개인 및 인증 테이블간에 OneToOne 관계를 만들려고합니다. 문제는 DB 테이블 "Auth"가 생성 될 때, Person을 참조해야하는 AUTH 테이블에 외래 키가 보이지 않는다는 것입니다. 객체는 Auth 테이블에 Person 테이블의 동일한 기본 키를 사용하게하는 것입니다.HIbernate 일대일 주석이 종속 테이블에 외래 키 GerericGenerator를 생성하지 않습니다.

@MappedSuperclass 
public abstract class DomainBase { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Version 
    @Column(name="OPLOCK") 
    private Integer version; 
} 


@Entity 
@Table(name = "person") 
public class Person extends DomainBase { 
     @OneToOne(cascade=CascadeType.ALL) 
      @JoinColumn(name="auth_id") 
     private Auth auth; 
} 


@Entity 
public class Auth { 
    @Id 
    @GeneratedValue(generator="foreign") 
    @GenericGenerator(name="foreign", strategy = "foreign", parameters={ 
     @Parameter(name="property", value="person") 
    }) 
    @Column(name="person_id") 
    private int personId; 
    --------------------------------- 

    @OneToOne(cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private Person person; 
} 

최대 절전 모드 DB 생성 후 내 데이터베이스 스크립트.

CREATE TABLE auth 
(
    person_id integer NOT NULL, 
    activate boolean, 
    activationid character varying(255), 
    last_login_attempt_date timestamp without time zone, 
    last_login_attempt_timezone character varying(255), 
    last_login_date timestamp without time zone, 
    last_login_timezone character varying(255), 
    nonlocked boolean, 
    num_login_attempts integer, 
    CONSTRAINT auth_pkey PRIMARY KEY (person_id), 
    CONSTRAINT uk_d68auh3xsosyrjw3vmwseawvt UNIQUE (activationid) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE auth 
    OWNER TO postgres; 

답변

1

문제가 당신이 그들 사이의 관계를 지정하지 않고, "사람"테이블과 "인증"테이블 사이에 두 번 @OneToOne 주석을 선언하는 것 같다. hibernate documentation을 살펴보면 2.2.5.1 지점에는 일대일 연결 사용에 대한 몇 가지 예가 나와 있습니다.

가장 좋은 방법은 한 테이블에서 foreing 키 열을 선언하고 다른 개체에서 mappedBy 매개 변수를 사용하는 것입니다. 당신의 코드에서이 될 것입니다 :

@Entity 
@Table(name = "person") 
public class Person extends DomainBase { 
    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="auth_id") 
    private Auth auth; 
} 


@Entity 
public class Auth { 
    @Id 
    @GeneratedValue(generator="foreign") 
    @GenericGenerator(name="foreign", strategy = "foreign", parameters={ 
     @Parameter(name="property", value="person") 
    }) 
    @Column(name="person_id") 
    private int personId; 

    @OneToOne(mappedBy = "auth") 
    private Person person; 
.... 
} 

이 최대 절전 모드의 문서에서 두 번째 예를 들어, 그냥 문장 후 "다음 예제에서, 관련 기관이 명시 적 외래 키 컬럼을 통해 연결되어"소개합니다. 이 코드를 테스트하고 "auth_id"열이 나타납니다.

+0

최대 절전 모드 설명서가 부족합니다. 무슨 기본 키를 공유로 onetone을 만드는가? 당신이 보여준 문서들에서 나는 그것이 무엇이되는지를 보지 못했습니다. 설명 할 수 있니? – Dean

+0

"공유 기본 키"로, 나는 단지 그들 사이의 관계를 허용하기 위해 다른 테이블의 외래 키와 같은 테이블의 ID를 사용하는 것을 의미합니다. 나는 "공유"라는 용어를 사용하지 말았어야했다. 내 대답을 편집 – EPerrin95

+0

그 구성으로, 나는이 오류를 얻고 있습니다 ->이 일을 시도 할 때 null 일대일 특성 [XXXXX.domains.Auth.person]에서 ID를 할당하려고 시도했습니다 (http : // pastie.org/9315522) – Dean

관련 문제