当我使用Hibernate时,我遇到了一个非常特殊的情况:
我们的系统有一个调查模块,一个调查有很多种问题,我们的问题展示信息如标题,提示应该支持国际化,可以由管理员在database
中定义,所以一个问题对应几个问题问题词汇的语言。以下是ER图:
这是POJO:
POJO SurveyModel:
@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 VocabularyModel:
@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
,但似乎与我的情况不符。
有人可以给我帮助和想法吗?非常感谢提前。
编辑:我有另一种方法可以做到这一点,只在不获取子对象的情况下进行调查,然后使用像language这样的参数手动查询其子对象。但它没有充分利用Hibernate。所以我也想在Hibernate中寻找一种方法来实现我的目标。
答案 0 :(得分:0)
在整整半天的工作中,我设法找到了解决这个问题的解决方案。它仍然是 Hibernate Filters
。以下是解决问题的解释。
1,在目标实体上定义 Filter
,如下所示:
@FilterDef(name="questionLanguage", parameters=@ParamDef(name="language", type="string"), defaultCondition="language='cn'")
2,在设置对象
上添加Filter
@Filter(name="questionLanguage", condition="language = :language")
3,由于过滤器的范围是一个 Session
,因此我们需要启用 Filter
并在查询之前设置参数你的父实体对象。
session.enableFilter("questionLanguage").setParameter("language", language);
为完成这项工作感到高兴。 ^。^。