Originally posted at 11/4/2010
Recently I had an interesting support call for NHibernate. The problem was a bit complex when explained to me, but we got it simplified to something like:
When we have a component that contains a set, that component is not null, even when all the members are null.
The problem is actually an intersection of two separate rules in NHibernate:
- When all the members of a component are null, the component itself will be null.
- A set is never null, an empty set is still a valid instance of a set.
When you add a set to a component, you add something that is never null. Hence, the behavior of NHibernate in this case is also valid, since we have a non null member value, there will be an instance of that component.
The problem is that the users conceptually thought of the empty set as null as well. I had some hard time explaining that sets are never null, and that no, this isn’t a bug or unexpected combination of the two features. Both behave exactly as expected, and the intersection of both worked as expected. In fact, trying to make it not work in this fashion would introduced a lot of work, complexity and additional queries.