Hibernate:拦截每个数据库查询

时间:2013-04-30 13:50:09

标签: hibernate

在我现有的项目中,我有一个aprox。数据库中有70多个表,我使用Hibernate作为数据访问层,因此每个查询都是使用条件API / HQL /命名查询完成的。现在我们在名为isDeleted的40多个表(事务表)中添加一列truefalse

现在在我当前的项目中,我必须通过在表上添加额外的Restrictions \ Where Clause来获取记录,这需要更多时间。

是否有任何方法可以拦截每个数据库查询(条件API / HQL /命名查询),以便我可以在相应的模型/表上添加where clause

休眠会话------> HQL /命名(本机)查询---->拦截器----->将在必填表格上添加where clause ---->将其发送到DB

1 个答案:

答案 0 :(得分:1)

是的,您可以将动态滤波器与拦截器结合使用。

http://nhforge.org/wikis/howtonh/contextual-data-using-nhibernate-filters.aspx

对于具有此类isDeleted属性的所有实体,我将让它们实现定义此属性的特定接口。 例如:

interface ISoftDeletable
{
   bool IsDeleted { get; }
}

class SomeEntity : ISoftDeletable {}

(请注意,我使用C#来解释我的观点,但我想它在java中会非常相似)

然后,您可以在创建Hibernate配置时定义过滤器定义:

var softDeleteFilterParametersType = new Dictionary<string, NHibernate.Type.IType> (1);
softDeleteFilterParametersType.Add ("p_isDeleted", NHibernateUtil.Bool);

cfg.AddFilterDefinition (new FilterDefinition("SoftDeleteFilter", ":p_isDeleted = isDeleted", softDeleteFilterParametersType, false);

然后,您应该将过滤器添加到实现ISoftDeletable接口的每个映射类:

foreach( var m in cfg.ClassMappings )
{
    if( typeof(ISoftDeletable).IsAssignableFrom (m.MappedClass) )
    {
        Property delColumn = m.GetProperty ("IsDeleted");

        m.AddFilter ("SoftDeleteFilter", ":p_isDeleted = " + delColumn.ColumnIterator.First().Name);
    }
}

然后,你仍然需要创建一个拦截器,它将参数的值设置为true或false,具体取决于你想要做什么。

也许你甚至可以在filterclause中对参数的值进行硬编码(如果你总是想要检索未删除的项目),这会使我的代码变得更简单。