Dire qu'il ya une table utilisateur avec la structure:Comment activer le filtre Hibernate pour sessionFactory.getCurrentSession()?
utilisateur
- Liste item
- userId (PK)
- entreprise (PK)
- userName
- adresse .. .etc
Et je veux récupérer les utilisateurs uniquement pour la société actuelle (la société peut être modifiée par l'utilisateur via l'interface utilisateur, donc la société est un paramètre d'exécution)
De même, il existe de nombreuses autres tables qui ont une structure similaire avec une colonne commune (société), et je veux limiter les données à la seule société actuelle, donc j'utilise le filtre hibernate pour filtrer les données.
annotations 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>
Définitions Filtre:
@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 pour:
@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(); } }
Si je change le getSession comme si;
private Session getSession(){
Session session = sessionFactory.getCurrentSession();
Filter filter = session.enableFilter("restrictToCurrentCompany");
filter.setParameter("currentCompanyNumber", UserUtils.getCurrentCompany());
return sessionFactory.getCurrentSession();
}
je peux alors activer le filtre et tout semble bon, mais au lieu de permettre au filtre lors de la session d'obtenir est-il une alternative plus simple à appliquer et activer le filtre pour toute usine session/niveau de l'application? Si oui, comment pourrais-je le faire en utilisant la configuration du ressort? J'ai essayé d'accrocher dans les intercepteurs d'hibernation (listerns d'événement de préchargement) mais je ne suis pas certain si c'est une approche correcte ou devrais-je plutôt employer la méthode getSession énumérée ci-dessus pour activer des filtres?
Qu'as vous finissez par faire, @sachink? De même, je veux automatiser mes valeurs de filtre d'exécution d'une manière moins gênante. –