0

セットアップ: 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 として取得されます。

それはなぜです?

4

1 に答える 1

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 の 2 つのフィールドを持つ ID_GEN テーブルを作成することを忘れないでください。

于 2012-08-13T05:07:44.420 に答える