0

Hibernate を使用しているときに、非常に特殊なケースが発生しました。

私たちのシステムには調査モジュールがあり、単一の調査には多くの種類の質問があり、タイトル、プロンプトなどの質問の表示情報はdatabase、管理者が定義できる国際化をサポートする必要があるため、単一の質問は質問語彙の複数の言語に対応します。ER図は次のとおりです。 ここに画像の説明を入力

POJO は次のとおりです。

POJO 調査モデル:

@Entity
@Table(name = "t_survey")
public class SurveyModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "surveyId")
    private Set<QuestionModel> questions = new HashSet<QuestionModel>();
}

POJO 質問モデル:

@Entity
@Table(name = "t_question")
public class QuestionModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "questionId")
    private Set<VocabularyModel> vocabularies = new HashSet<VocabularyModel>();
}

POJO語彙モデル:

@Entity
@Table(name = "t_vocabulary")
public class VocabularyModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String language;
    private String title;
    private String prompt;
}

したがって、図と POJO の関係は、それらの関係を明確に示しています。ユーザーがアンケートに回答すると、一度に 1 つの言語の語彙オブジェクトのみが質問に必要になります。そうです、語彙のすべての言語を含む語彙セットから手動でフィルタリングすることで取得できますが、意味がなく、生成されます。パフォーマンスが低下します。私たちのシステムでは、親オブジェクトのすべての子セットはloaded lazyです。ここで、SurveyModel のような親オブジェクトを取得した後、サブクエリに language のようなパラメーターを渡して語彙セットをフィルター処理するにはどうすればよいでしょうか? を使おうと思っHibernate Filtersていたのですが、私の場合は合わなかったようです。

誰でも私に助けやアイデアを与えることができますか? よろしくお願いします。

編集:これを行う別の方法があります。サブオブジェクトを取得せずに調査のみを取得し、言語のようなパラメーターを使用してサブオブジェクトを手動でクエリします。しかし、Hibernate をフルに活用しているわけではありません。そのため、Hibernate 内で目標を達成する方法も探したいと考えています。

4

1 に答える 1

0

半日の作業を通して、この問題を解決する解決策を見つけることができました。それはまだHibernate Filtersです。以下は、それを解決するための説明です。

Filter1、次のようにターゲット エンティティを定義します。

@FilterDef(name="questionLanguage", parameters=@ParamDef(name="language", type="string"), defaultCondition="language='cn'")

Filter2,セットオブジェクトにを追加する

@Filter(name="questionLanguage", condition="language = :language")

3、フィルターのスコープは単一であるため、親エンティティ オブジェクトをクエリする前に、パラメーターSessionを有効にして設定する必要があります。Filter

session.enableFilter("questionLanguage").setParameter("language", language);

これができたことに幸せを感じてください。^.^.

于 2013-06-26T08:47:39.043 に答える