次の構造の User テーブルがあるとします。
ユーザー
- リスト項目
- ユーザー ID (PK)
- 会社 (PK)
- ユーザー名
- 住所・・・など
そして、現在の会社のユーザーのみを取得したい (会社は UI を介してユーザーが変更できるため、会社はランタイムパラメーターです)
同様に、共通の列 (会社) を持つ同様の構造を持つ他の多くのテーブルがあり、データを現在の会社のみに制限したいので、休止状態フィルターを使用してデータをフィルター処理しています。
休止状態の注釈:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">Dialect....</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>User</value>
.....
</list>
</property>
</bean>
フィルター定義:
@org.hibernate.annotations.FilterDef(name="restrictToCurrentCompany", パラメータ = {@org.hibernate.annotations.ParamDef( 名前 = "現在の会社番号"、タイプ = "int" ) } ) @実在物 @Table(name = "ユーザー") @org.hibernate.annotations.Filter( name = "restrictToCurrentCompany", 条件="会社 = :現在の会社番号" ) public class User は Serializable を実装します { 民間企業; プライベート文字列のユーザー名; ...等.. }
ダオの:
@リポジトリ @Transactional(readOnly = true) public class UserDAOImpl は UserDAO を実装します { @Autowired(必須 = true) プライベート SessionFactory sessionFactory; パブリック セット getUsers(){ .....現在の会社のユーザーを取得するための基準クエリ } プライベート セッション getSession(){ sessionFactory.getCurrentSession(); を返します。 } }
getSession をそのように変更すると;
private Session getSession(){
Session session = sessionFactory.getCurrentSession();
Filter filter = session.enableFilter("restrictToCurrentCompany");
filter.setParameter("currentCompanyNumber", UserUtils.getCurrentCompany());
return sessionFactory.getCurrentSession();
}
次に、フィルターを有効にすると、すべてがうまく見えますが、セッションの取得中にフィルターを有効にする代わりに、セッションファクトリー/アプリケーションレベル全体にフィルターを適用して有効にする簡単な方法はありますか? もしそうなら、どうすれば春の設定を使ってそれを行うことができますか?
Hibernate インターセプター (プリロード イベント リスターン) にフックしようとしましたが、これが正しいアプローチなのか、それとも上記の getSession メソッドを使用してフィルターを有効にするべきなのか、少しわかりません。