3

JPAプロバイダーとしてHibernateを使用しています。たとえば、このクラスがあります。

@Question("multipleChoiceQuestion")
@Entity
public class MultipleChoiceQuestion extends QuestionUnit {

    private ArrayList<String> questionContent;

    public MultipleChoiceQuestion() {
        this(null, null);
    }

    public MultipleChoiceQuestion(ArrayList<String> questionContent,
            AnswerUnit correctAnswer) {
        super(correctAnswer);
        this.questionContent = questionContent;
    }

    public ArrayList<String> getQuestionContent() {
        return this.questionContent;
    }
}

それを永続化すると、questionContentプロパティはblobとして保存されます。ElementCollectionアノテーションを使用して、ArrayListのコンテンツ用に個別のテーブルを作成できることを知っています。

この動作(blobとしてプロパティであるコレクションを保存する)がJPA仕様のどこかで指定されているのか、それともHibernate固有なのか疑問に思います。

4

1 に答える 1

3

私はJPAでこの動作を見たので、Hibernate固有ではありません。重要なのは、その属性にアノテーションがなく、プリミティブのArrayList(つまり、IDがない)であり、ArrayListがシリアル化可能であるため、JPAエンジンは、その属性をBLOBとしてマップする必要があることを「理解」します。明らかに、文字列の概念は実際にはオブジェクトではないため、ORMで文字列をオブジェクトとしてマップすることは意味がありません。私はその主題について非常に良い投稿を見つけました。

hibernate仕様の項目-「2.2.2.5。注釈なしのプロパティのデフォルト」(JPAではないことはわかっていますが、Hibernateはそれに続きます):

プロパティに注釈が付けられていない場合は、次のルールが適用されます。

それ以外の場合、プロパティのタイプがSerializableの場合、シリアル化されたバージョンのオブジェクトを保持する列に@Basicとしてマップされます。

于 2012-08-14T20:35:31.620 に答える