2016-05-10 9 views
0

ich ein einfaches Setup, wo ichHibernate Datenfilter auf many-to-many-Sammlung Mapping

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

und

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

das ist gut arbeiten, werden die Übersetzungen so viele-zu kartiert viele mit 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> 

Da die Liste der Übersetzung locales kann potenziell sehr groß sein, wollte Hibernate dat nutzen ein Filter auf dieser Sammlung, so fügte ich

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

den Filter zu definieren, und hinzugefügt, um Mapping

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

ich vor etwas ähnliches getan haben, aber nicht zu viele-zu-viele Sammlungen und Es hat gut funktioniert, aber wenn ich dies zu einem Set mache, scheint es, dass es versucht, das Gebietsschema mit der Join-Tabelle abzugleichen, und nicht die Übersetzungstabelle (was ich eigentlich will).

Funktioniert der Datenfilter tatsächlich für Viele-zu-Viele-Sammlungen und wie soll ich ihn einrichten?

Antwort

1

Scheint Hibernate haben zwei Datenfiltermodi, Filter und Filter Join-Tabelle.

Wenn ähnlich

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

Es filtert auf der Join-Tabelle verwendet, wenn es jedoch wie folgt verwendet wird:

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

Sie die Filter funktioniert auf der inversen Seite (dh Translation Einheit). Ich musste die Bedingung hier wieder hinzufügen, nicht sicher, warum, aber es scheint, dass es nicht mit dem anderen Filter-Def verwendet werden konnte, den ich bereits hatte.