是的,您可以将动态过滤器与拦截器结合使用。
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,具体取决于您要执行的操作。
也许你甚至可以在你的过滤子句中硬编码参数的值(如果你总是想检索未删除的项目),我猜这会使上面的代码更简单。