Как включить фильтр гибернации для sessionFactory.getCurrentSession ()?

Допустим, есть таблица пользователей со структурой:

Пользователь

  • Элемент списка
  • userId (PK)
  • company (PK)
  • userName
  • адрес ... и т. д.

И я хочу получить пользователей только для текущей компании (компания может быть изменена пользователем через пользовательский интерфейс, поэтому компания является параметром времени выполнения)

Точно так же есть много других таблиц, которые имеют похожие структура с общим столбцом (компания), и я хочу ограничить данные только текущей компанией, поэтому я использую фильтр гибернации для фильтрации данных.

Аннотации Hibernate:

<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",
    parameters = {@org.hibernate.annotations.ParamDef(
            name = "currentCompanyNumber", type = "int"
        )
    }
)
@Entity
@Table(name = "USER")
@org.hibernate.annotations.Filter(
        name = "restrictToCurrentCompany",
        condition="company = :currentCompanyNumber"
)
public class User implements Serializable {
    private int company;
    private String userName;
    ...etc..
}

Dao's:


@Repository
@Transactional(readOnly = true)
public class UserDAOImpl implements UserDAO {

    @Autowired(required = true)
    private SessionFactory sessionFactory;

    public Set getUsers(){
        .....Criteria queries to retrieve users for the current company     
    }

    private Session getSession(){
        return sessionFactory.getCurrentSession();
    }

}

Если я изменю getSession следующим образом:

private Session getSession(){
    Session session = sessionFactory.getCurrentSession();
    Filter filter = session.enableFilter("restrictToCurrentCompany");
    filter.setParameter("currentCompanyNumber", UserUtils.getCurrentCompany());
    return sessionFactory.getCurrentSession();
}

, то я могу включить фильтр, и все будет хорошо, но вместо включения фильтра во время получения сеанс есть ли более простая альтернатива для применения и включения фильтра для всей фабрики сеанса / уровня приложения? Если да, то как я могу сделать это с помощью конфигурации Spring?

Я попытался подключиться к перехватчикам гибернации (списки событий перед загрузкой), но я немного не уверен, правильный ли это подход или мне лучше использовать метод getSession, указанный выше, чтобы включить фильтры?

9
задан sachink 15 April 2011 в 18:17
поделиться