2017-02-26 5 views
0

내 앱 시작시 최대 절전 모드에서 새로운 제약 조건을 추가하여 테이블을 변경하고 있습니다. 다음은 내 문제의 전체 그림을 얻는 샘플 코드입니다.JPA 데이터베이스의 기존 제약 조건을 인식하지 못합니다.

PostgreSQL의 스키마

create table public."A" { 
    a_id serial primary key 
} 

create table public."B" { 
    b_id serial primary key 
} 

create table public."C"(
    a_id integer not null references public."A" (a_id), 
    b_id integer not null references public."B" (b_id), 
) 

DB 모델 내 응용 프로그램 시작시

class A{ 

    @Id 
    @Column(name = "a_id") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    public Integer aId; 

} 


class B { 

    @Id 
    @Column(name = "b_id") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    public Integer bId; 

} 

class C { 

    @ManyToOne 
    @JoinColumn(name = "a_id") 
    public A a; 


    @ManyToOne 
    @JoinColumn(name = "b_id") 
    public B b; 

} 

, 그것은 다시 제약 조건을 만드는 것입니다. DB에서

Hibernate: alter table public."C" add constraint FKk4caeiw8tynv7g0p13h5inaht foreign key (a_id) references public."A" 
Hibernate: alter table public."C" add constraint FK4bsokehyo37wygp12onlu8fbl foreign key (b_id) references public."B" 

는 내가 2 개 개의 새로운 제약

여기 잘못 될 수 무엇
CONSTRAINT FKk4caeiw8tynv7g0p13h5inaht foreign key (a_id) 
    REFERENCES public."A" (a_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION, 
CONSTRAINT FK4bsokehyo37wygp12onlu8fbl foreign key (b_id) 
    REFERENCES public."B" (b_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 

참조 제약이 외에도 이미

CONSTRAINT "C_a_id_fkey" FOREIGN KEY (a_id) 
     REFERENCES public."A" (a_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
CONSTRAINT "C_b_id_fkey" FOREIGN KEY (b_id) 
     REFERENCES public."B" (b_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 

의 availble 것을 볼?

+0

'persistence.xml'에서 정의한 스키마 생성 전략 ('hibernate.hbm2ddl.auto/avax.persistence.schema-generation.database.action')은 무엇입니까? – crizzis

답변

1

Hibernate는 제약 조건 이름을 비교하고 지정된 이름에 대한 제약 조건이 존재하지 않는다는 것을 알기 때문에 존재하지 않는다고 생각하여 다시 작성하기 때문입니다.

@JoinColumn(name = "...", foreignKey = @ForeignKey(name = "...")) 

참고 : 최대 절전 모드 버전의 몇 가지 문제가 있었다 최대 5.2.7로 특정 주석이 전달을 준수하지 않은 경우

한 가지 해결 방법은 수동으로 주석에 이름 제약 조건을 지정하는 것입니다 외래 키에 주석 된 값을 데이터베이스 스키마 도구에 올바르게 추가합니다. 나는 @JoinColumn이 좋았지 만, 그렇지 않은 경우에, 5.2.8을 사용하는 것은 무시 된 그 주석들을 피하기 위해 도입 된 모든 픽스들을 가지고 있다고 믿는다.

또 다른 해결 방법은 분명히 기존 제약 조건을 제거하고 Hibernate가 고유 한 명명 전략을 사용하여 다시 추가하도록 허용하는 것입니다.