Hibernate数据过滤多对多集合映射

时间:2016-05-10 12:48:09

标签: hibernate hibernate-mapping

我有一个简单的设置

class Translation
  string locale
  enum property (NAME, DESCRIPTION)
  string name

class SomeObject
  string name
  string description
  set<Translation> translations;

哪个工作正常,翻译使用hbm

映射为多对多
<set name="translations" table="someobjecttranslations" cascade="delete-orphan" lazy="false">
  <cache usage="read-write" />
  <key column="someobjectid" />
  <many-to-many class="Translation" column="translationid" unique="true" />
</set>

由于翻译区域设置列表可能很大,想要在此集合上利用hibernate数据过滤器,所以我添加了

<filter-def name="locale" condition=" locale = :locale ">
  <filter-param name="locale" type="string" />
</filter-def>

定义过滤器,并添加到映射

<set name="translations" table="someobjecttranslations" cascade="delete-orphan" lazy="false">
  <cache usage="read-write" />
  <key column="someobjectid" />
  <many-to-many class="Translation" column="translationid" unique="true" />
  <filter name="locale" />
</set>

之前我做过类似的事情,但没有做多对多的集合,而且它一直运行正常,但是当我对一个集合执行此操作时,似乎它尝试将该区域设置与连接表匹配,而不是翻译表(这实际上就是我想要的)。

数据过滤器是否真的适用于多对多集合,我应该如何设置它?

1 个答案:

答案 0 :(得分:1)

似乎Hibernate有两种数据过滤模式,过滤器和过滤器连接表。

如果像这样使用

<set name="translations" table="someobjecttranslations" cascade="delete-orphan" lazy="false">
  <cache usage="read-write" />
  <key column="someobjectid" />
  <many-to-many class="Translation" column="translationid" unique="true" />
  <filter name="locale" />
</set>

它在连接表上进行过滤,但是,如果使用它,则使用如下:

<set name="translations" table="someobjecttranslations" cascade="delete-orphan" lazy="false">
  <cache usage="read-write" />
  <key column="someobjectid" />
  <many-to-many class="Translation">
    <column name="translationid" unique="true" />
    <filter name="locale" condition=" locale = :locale "/>
  </many-to-many>
</set>

它在反面进行过滤(即翻译实体)。我不得不在这里添加条件,不知道为什么,但似乎它不能与我已经拥有的其他过滤器一起使用。