0

休止状態のオブジェクトが機能する方法について頭を悩ませています。ここに私のモデルがどのように見えるかの小さな塊があります:

就職口:

@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(
        name="jobOpening_questionSet",
        joinColumns=@JoinColumn(name="jobOpenings_id"),
        inverseJoinColumns=@JoinColumn(name="questionSets_id")
)
@IndexColumn(name="question_sets_idx",base=0,nullable=false)
public List<QuestionSet> getQuestionSets() {
    return questionSets;
}

質問セット:

@ManyToMany(mappedBy="questionSets",fetch=FetchType.EAGER)
public Set<JobOpening> getJobOpenings() {
    return jobOpenings;
}

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@IndexColumn(name="questions_idx",base=0)
@JoinColumn(name="questionset_id",nullable=false)
public List<FormQuestion> getQuestions() {
    return questions;
}

フォーム質問:

@ManyToOne
@JoinColumn(name="questionset_id", insertable=false, updatable=false, nullable=false)
@OnDelete(action=OnDeleteAction.CASCADE)
public QuestionSet getQuestionSet() {
    return questionSet;
}

たとえば、質問セット内の質問を変更したり、質問セットが関連付けられているジョブを変更したりするにはどうすればよいでしょうか。たとえば、質問セット内の質問を編集するには、ID を介して質問を取得し、いくつかの値を変更して、merge() で元に戻すことができるはずだと思いますが、これは機能しません。

私は、Spring の Hibernate (appfuse) を、通常は切り離されたオブジェクトとして使用しています。

4

1 に答える 1

0

ハイバネート セッションは、少し異なる方法で動作します。

  • SessionFactoryを作成しSessionます。ほとんどの場合、Sessionスレッドごとに新しいものが作成されます。これは、Web コンテキストではリクエストごとのセッションと呼ばれます。
  • Hibernate オブジェクト (エンティティ) には、 persistentdetachedtransientの 3 つの状態があります。

    • 永続的とは、オブジェクトが現在アクティブなセッションによって最近ロードされたことを意味します
    • 一時的は、オブジェクトがセッションの一部になったことがないことを意味します
    • デタッチとは、オブジェクトが一度セッションからロードされたが、セッションが閉じられたことを意味します (関連付けられていたセッションからデタッチされていません)。
  • 永続オブジェクトは、マージ、更新などの必要はありません - 内部状態を変更するたびに、休止状態はすでにそれを認識しており、次のオブジェクトで必要なクエリを作成しますflush()

  • 切り離されたオブジェクトは、セッションにマージして戻す必要がありますが、それらの ID は、オーバーライドhashCode()equals()ビジネス キーを使用して認識できる必要があります。

セッションとトランザクションのドキュメントをご覧ください

于 2010-06-15T05:04:48.100 に答える