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 QuestionModel:

@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 关系清楚地显示了它们的关系。现在当用户进行调查时,一次只需要一种语言的词汇对象来提问,是的,我们可以通过从包含所有语言词汇的词汇集中手动过滤得到它,但它没有意义并产生较低的性能。在我们的系统中,父对象的所有子集都是loaded lazy,那么在我在这里获得像 SurveyModel 这样的父对象后,如何将语言之类的参数传递给子查询以过滤词汇集?我试图使用Hibernate Filters,但它似乎与我的情况不符。

任何人都可以给我帮助和想法吗?提前非常感谢。

编辑:我有另一种方法,只获取调查而不获取其子对象,然后使用语言等参数手动查询其子对象。但它并没有充分利用 Hibernate。所以我也想在 Hibernate 中寻找一种方法来实现我的目标。

4

1 回答 1

0

经过半天的工作,我设法找到了解决这个问题的方法。它仍然是Hibernate Filters. 以下是解决它的说明。

1,像这样定义一个Filter目标实体:

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

2、添加Filteron set对象

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

3、由于Filter的作用域是单一的Session,所以我们需要Filter在查询父实体对象之前启用并设置参数。

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

为完成这项工作感到高兴。^.^.

于 2013-06-26T08:47:39.043 回答