The ajaxSingle attribute causes the value of the first dropdown list to be set in the corresponding control property. Without it, the entire form would be submitted, and if any control on the form had an invalid value, the whole operation would be suppressed.
What I do to cascade dropdowns is to set the SelectItem list(s) on the dependent control(s) dynamically. That is, EntityMBean.getCountryList() contains logic like this:
I then pair that with a valueChangeListener attached to the GeoUnit control. It does this:
Because of the ordering of processes in the
JSF lifecycle, this works out very neatly and has the side benefit that the same caching getCountryList method also works well when populating on initial form display.
Note that the valueChangeListener does not attempt to do major data operations itself - it just sets things up for when everything is neatly in place and ready to use.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.