セットアップ: JPA プロバイダーとしての Sprting、JPA、および Hibernate。
2 つのクラス階層があり、1 つは質問用、もう 1 つは回答用です。各階層のルートには、次のような抽象クラスがあります。
@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;
}
}
各階層には 3 つの具象クラスがあります。それらをデータベースに保存したかったので、今のところ SQLite を使用しています。
私が正しく理解していれば、この継承戦略は具体的なクラスごとに 1 つのテーブルを作成します。
さて、GeneratedValue ストラテジーを auto で設定するとエラーが発生したので、table に切り替えました。私がそれを正しく理解していれば、テーブルごとに異なる独立したIDの生成があります。
しかし、奇妙なことが起こりました。簡単なテスト コードを作成しました。
QuestionUnit unit1=new OpenQuestion("4+4", new OpenQuestionAnswer("8"));
questionUnitDao.addQuestionUnit(unit1);
System.out.println(questionUnitDao.getQuestionUnit(OpenQuestion.class, 1).getQuestionContent());
最初の質問は正常に挿入されましたが、主キーは一意である必要があるというエラーが発生しました。何かを挿入すると、65536 などの非常に大きな数字が ID として取得されます。
それはなぜです?