Modifications to collections are always handled the same regardless of whether a filter is enabled/used or not. Not considering orphan deletes, such modifications come in two flavors:
1) a collection is "dereferenced" :
Code:
Order o = ( Order ) session.load( Order.class, orderId );
o.setLineItems( new HashSet() );
...
This causes Hibernate to "recreate" the collection (i.e. the original elements are deleted and any elements in the new collection reference are added).
2) elements are added or removed from a collection. Hibernate's Collection and Map impls keep track of the elements added and the elements removed, such that it can handle those individually at flush time.
Virtualization (aka filters) can be applied at either a class-level or collection-level.
BTW, the following HQ does essentially the same thing:
Code:
select t
from Topic as t
join fetch t.posts as p
where p.date < :date
The where clause "filters" out the joined result set rows representing posts not meeting that criteria. Note, however, that this approach is questionable if you use second-level caching (then definitely use filters instead).