0

Hibernate3.6.7-FinalおよびSpring3.0.5を使用しています。

私はこのような実体を持っています

@Entity
public class Foo {
    @ManyToOne
    private Bar bar;
}

@Entity
public class Bar {
    @Column
    String group;
}

で持っているすべてのものを@Filter取得したいFooでどのように使用できますか?これはセキュリティ上の制約であると思われます。FooBargroup = :group

から@Filter(name = "groupFilter", condition = "group = :group")属性を設定してみましたが、うまくいきませんでした。hibernateはこれをサポートしていますか、それともFilterはエンティティ/コレクションレベルでのみ機能しますか?このセキュリティ制約を追加するには、すべてのHQLを変更する必要がありますか?barFoo

4

2 に答える 2

1

まず、@ FilterDefをどこかに作成し(これにより、使用可能なパラメーターとデフォルトの条件が定義されます)、次に特定のクラスで@Filterを定義する必要があります。

最後に、Sessionオブジェクトでフィルターを有効にし、必要なパラメーターを設定する必要があります。デフォルトでは、Hibernateセッションでフィルターは有効になっていません。セッションが開いたら、必要な特定のものを有効にする必要があります。

例については、セクション19.1を参照してください:http: //docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html

@FilterDef(name="groupFilter", parameters={@ParamDef( name="group", type="string" )})
@Filters(
  { @Filter(name="groupFilter", condition="group = :group") }
)
public class ... {
}

次に、daoコードのどこかに:

session.enableFilter("groupFilter").setParameter("group", group);

hqlに触れる必要はありません。フィルタを有効にすると、実際の@Filterが定義されているすべてのクラスが自動的に条件を適用します。

コレクションのために物事を行うための追加の方法があります、そして私はあなたがそれについて上で参照されたドキュメントを読むことを提案します。ただし、一般的には、@Filterアノテーションクラスとコレクションプロパティを提供できます。

于 2012-05-22T02:30:35.440 に答える
0

@ManyToOne結合でフィルターを使用する場合の問題は、次の原因によるものです。これが私が見なければならないものであるため、私はHibernate4.3.10を参照しています。

関連するSQLフラグメントは、クラスorg.hibernate.engine.internal.JoinSequence、メソッドによって生成されtoJoinFragmentます。

/**
 * Generate a JoinFragment
 *
 * @param enabledFilters The filters associated with the originating session to properly define join conditions
 * @param includeAllSubclassJoins Should all subclass joins be added to the rendered JoinFragment?
 * @param withClauseFragment The with clause (which represents additional join restrictions) fragment
 * @param withClauseJoinAlias The
 *
 * @return The JoinFragment
 *
 * @throws MappingException Indicates a problem access the provided metadata, or incorrect metadata
 */
public JoinFragment toJoinFragment(
        Map enabledFilters,
        boolean includeAllSubclassJoins,
        String withClauseFragment,
        String withClauseJoinAlias) throws MappingException {

        ...

        final String on = join.getAssociationType().getOnCondition( join.getAlias(), factory, enabledFilters, treatAsDeclarations );

定義された関係に応じて、またはをjoin.getAssociationType()返します。CollectionTypeEntityType

前者は次のような宣言を表します。

@OneToMany
private List<MyEntity> myEntities;

後者はこれを表します:

@ManyToOne
private MyEntity myEntity;

最初のケースでは、この方法が使用されます。

@Override
public String getOnCondition(
        String alias,
        SessionFactoryImplementor factory,
        Map enabledFilters,
        Set<String> treatAsDeclarations) {
    return getAssociatedJoinable( factory ).filterFragment( alias, enabledFilters, treatAsDeclarations );
}

2番目のケースでは、メソッドは次のようになります。

@Override
public String getOnCondition(
        String alias,
        SessionFactoryImplementor factory,
        Map enabledFilters,
        Set<String> treatAsDeclarations) {
    if ( isReferenceToPrimaryKey() && ( treatAsDeclarations == null || treatAsDeclarations.isEmpty() ) ) {
        return "";
    }
    else {
        return getAssociatedJoinable( factory ).filterFragment( alias, enabledFilters, treatAsDeclarations );
    }
}

この意味は:

  • エンティティの定義に参照されているサブエンティティのリストがある場合、フィルターは無条件に適用されます。
  • 参照されるサブエンティティが1つしかない場合、特定の条件が満たされた(満たされていない)ときにフィルターが適用されます。

コードに基づいて、次の場合に@ManyToOne関係の場合にフィルターを適用できると思います。

  • 参照されるエンティティでは、主キーではないフィールドを使用します。
  • TREAT演算子が使用されます(たとえば、を参照してください)。ここまたはここ)
于 2019-05-17T21:57:50.137 に答える