3

mergeのメソッドで問題が発生しましたEntityManager

私はこのクラスを持っています

@Entity
public class QuestionList {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToOne
    private UserEntity user;

    @OneToMany(cascade = CascadeType.ALL)
    private List<QuestionUnit> units = new ArrayList<QuestionUnit>();

    public List<QuestionUnit> getUnits() {
        return units;
    }

    public void setUnits(List<QuestionUnit> units) {
        this.units = units;
    }

    public Long getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void addQuestionUnit(QuestionUnit QuestionUnit) {
        this.units.add(QuestionUnit);
    }

    public void setUser(UserEntity user) {
        this.user = user;
    }

    public UserEntity getUser() {
        return this.user;
    }

}

今、unitsマージ内のオブジェクトの1つを変更するだけなら問題ありませんが、コレクションに新しいオブジェクトを削除または追加すると、マージが発生する方法は、取得delete from QuestionList_QuestionUnit where QuestionList_id=?してからすべての行が1つずつ追加されることですinsert into QuestionList_QuestionUnit (QuestionList_id, units_id) values (?, ?)

追加/削除されたオブジェクトに関連付けられた行を追加/削除するように JPA/Hibernate に指示することは可能ですか? または、マージがコレクションで機能する方法ですか。私の場合、データベースを更新するための独自のクエリを作成する必要があります。

このコレクションはかなり巨大になる可能性があり、すべての行を削除してほぼすべてを再度挿入するだけでは、テーブルを更新する良い方法とは思えないため、質問しています。

編集:要求に応じて:

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

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long 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 long getId() {
        return id;
    }

    public void setId(long id){
        this.id=id;
    }

    public abstract Object getQuestionContent();

    public abstract String getTitle();

}

この階層には 3 つの具象クラスがあります。たとえば、

@Question("openQuestion")
@Entity
public class OpenQuestion extends QuestionUnit {

    public void setQuestionContent(String questionContent) {
        this.questionContent = questionContent;
    }

    private String questionContent;

    public OpenQuestion() {
        this(null, new OpenQuestionAnswer());
    }

    public OpenQuestion(String questionContent, AnswerUnit correctAnswer) {
        super(correctAnswer);
        this.questionContent = questionContent;
    }

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

    public String getTitle() {
        return questionContent;
    }
}

@Transactional(propagation = Propagation.REQUIRED)
public void update(QuestionList questionList) {
    entityManager.merge(questionList);
}

リストは切り離された状態であるため、このメソッドはすべての更新に使用されます。

4

1 に答える 1

2

Setの代わりにListを使用しているために問題が発生していると思われます。

@OneToMany(cascade = CascadeType.ALL)
private List<QuestionUnit> units = new ArrayList<QuestionUnit>();

への変更

@OneToMany(cascade = CascadeType.ALL)
private Set<QuestionUnit> units = new HashSet<QuestionUnit>();

多対多の関係セットまたはリストを休止状態にしますか?

于 2012-09-06T15:17:28.640 に答える