2016-06-13 2 views
0

나는 postgress 데이터베이스 내의 테이블 인 클래스를 가지고있다. 클래스는 다른 클래스에 의해 확장됩니다. 메인 클래스는 상위hibernate가 다음 시퀀스 값을 얻을 수 없다.

@Inheritance에서 다음 주석 (전략 = InheritanceType.TABLE_PER_CLASS)

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    @Column(name="id") 
    private int id; 
    ..... 

다음과 같은 오류가 발생

public class myspecialPolicy extends policy { 
    .... 
} 

데이터베이스에 삽입 번째 클래스가

org.postgresql.util.PSQLException : 오류 : 관계 "hibernate_sequence"가 존재하지 않습니다.

이 문제를 해결하는 방법을 잘 모르겠다면 어떤 도움을 주셔서 감사드립니다. 당신이 사용하는 경우

@Id 
@Column(name = "id") 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 
+0

실제로 시퀀스를 사용하여 값을 생성하고 있습니까? 아니면 자동 숫자 필드를 사용하고 있습니까? –

답변

0

내 문제가 긴으로 nxt_val 열이있는 hibernate_sequence 테이블을 생성하고 해결 무엇 내 데이터베이스의 데이터 유형.

는 SQL Create hibernate_sequence(nxt_val long);

하고

Insert into hibernate_sequence (nxt_val) values ('12')NB 값은 12 어떤 숫자가 될 수있다.

이제 hibernate는 nxt_val의 값을 선택하여 아무 것도 지정하지 않고 시퀀스 생성을 결정합니다. TableGenerator, Sequence, Auto

0

최대 절전 모드 버전의 따라, 이러한 매핑 중 하나는, 당신이 사용할 수있는 당신에게 (나중에 4.3)

@Column(name = "id", columnDefinition = "serial") 
@Generated(GenerationTime.INSERT) 
private int id; 
최근 최대 절전 모드 버전에

을 도울 수 사용할 일련 값 :

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="genName") 
    @SequenceGenerator(name="genName", sequenceName="yourSequenceNameInDatabase",initialValue=1,allocationSize=1) 
    @Column(name="id") 
    private int id; 

표 전략을 사용하려면 다음을 작성해야합니다. (예를 들어 테이블 이름에 대한 sqlName를 가치, 그리고으로 순서) 두 개의 열이있는 테이블과이 작업을 수행 :

@Entity 
@Table(name="policy_action") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class PolicyAction { 


    @Id 
    @GeneratedValue(strategy=GenerationType.Table,generator="genName") 
    @TableGenerator(name="genName", table="sequenceTable", pkColumnName="seqName",valueColumnName="value",pkColumnValue="policyAction",initialValue=1,allocationSize=1) 
    @Column(name="id") 
    private int id; 
+0

상속 때문에 작동하지 않을 수 있습니다. 첫 번째 방법에 대한 테이블 –

2

:

+0

각 테이블마다 자체 시퀀스 이름을 가질 방법을 모르겠습니다. 하위 클래스? –

+0

잘 될지 모르지만 id 속성 대신 getId() 메서드에서 '@Id'및 '@Column'을 사용하고 각 클래스에서 ID 생성기를 재정의 할 수 있습니다. –

+0

추가 정보 : SGBD와 호환되므로 GenerationType.Table을 사용하는 것이 좋습니다.SequenceGenerator를 사용하여 PostgreSQL을 SQLServer로 마이그레이션해야 할 때 문제가 발생하여 Sequence에서 Table로 전환되었습니다. –

관련 문제