2012-08-10 2 views
0

설정 : JPA 프로 바이더로서 Sprting, JPA, Hibernate.Spring, JPA, Hibernate-id 생성

두 개의 계층 구조가 있습니다. 하나는 질문 용이고 다른 하나는 대답 용입니다. 3 개 구체적인 클래스가

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class QuestionUnit { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    @OneToOne(cascade = CascadeType.ALL) 
    private AnswerUnit correctAnswer; 

    public QuestionUnit(AnswerUnit correctAnswer) { 
     this.correctAnswer = correctAnswer; 
    } 

    public void setCorrectAnswer(AnswerUnit correctAnswer) { 
     this.correctAnswer = correctAnswer; 
    } 

    public AnswerUnit getCorrectAnswer() { 
     return this.correctAnswer; 
    } 

    public int getId() { 
     return id; 
    } 

    public abstract Object getQuestionContent(); 
} 

각 계층의

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class AnswerUnit { 

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

    public abstract Object getAnswerContent(); 

    public abstract boolean isEqual(AnswerUnit otherAnswer); 

    public int getId(){ 
     return id; 
    } 
} 

: 각 계층 구조의 루트에서 예를 들어 추상 클래스가있다. 우리는 데이터베이스에 저장하고 싶었습니다. 지금은 SQLite를 사용하고 있습니다.

이 상속 전략을 올바르게 이해하면 구체적인 하나의 클래스 당 하나의 테이블이 만들어집니다.

이제 자동으로 GeneratedValue 전략을 설정할 때 오류가 발생하여 테이블로 전환했습니다. 내가 올바르게 이해한다면, 각 테이블마다 서로 다른 독립적 인 ID 생성이있을 것입니다.

하지만 이상한 일이있었습니다. 나는 간단한 테스트 코드 생성 : 첫 번째 질문은 성공적으로 삽입 된

QuestionUnit unit1=new OpenQuestion("4+4", new OpenQuestionAnswer("8")); 
questionUnitDao.addQuestionUnit(unit1); 
System.out.println(questionUnitDao.getQuestionUnit(OpenQuestion.class, 1).getQuestionContent()); 

을, 그러나 나는 예를 65536에 대한 I는 식별자로 매우 큰 숫자를 얻을 무언가를 삽입 할 때 기본 키는 이제 고유해야한다는 오류가 발생했습니다.

왜 그렇습니까?

+0

큰 생성 ID에 대해서는 [이 질문을 참조하십시오] (http://stackoverflow.com/questions/2892355/jpa-generatedvalue-with-generationtype-table-does-a-big-jump-after-jvm-restart)) – siebz0r

+0

Hilo 알고리즘이 ID 생성에 사용 되었기 때문에 감사 또는 연결이 가능합니다. – Andna

+0

AUTO로 설정하면 어떤 오류가 발생합니까? 또한 기본 유형을 ID로 사용하는 것은 권장되지 않습니다. –

답변

0

두 엔티티에 TableGenerator 주석을 추가 할 수 있습니다. 샘플을 봅니다.

@Id 
    @TableGenerator(name = "QuestionUnitGen", 
    table = "ID_GEN", 
    pkColumnName = "GEN_NAME", 
    pkColumnValue = "QuettionUnit_Gen", 
    valueColumnName = "GEN_VAL", 
    initialValue = 0, 
    allocationSize = 100 
) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "QuestionUnitGen") 
    private int id; 

하지만 데이터베이스에 GEN_NAME 및 GEN_VAL 두 개의 입력란이있는 ID_GEN 테이블을 만드는 것을 잊지 마십시오.