I recently needed to use JiBX to parse a XML document into domain objects that contained bidirectional associations with collections. The issue started out as a simple NullPointerException since each child object did not have a reference back to its parent.
After some searching on Google, the only suggestions that I came across had to do with using the post-set attribute, which gets called after the class has been unmarshalled. For various reasons, most of which I did not want the domain classes tied to JiBX, I sought out a different solution.
The solution I came up with was to use a set-method for the collection instead of field. So I replaced field=”fieldName” with set-method=”setFieldName”. This set method ensures that the bidirectional association is properly defined.
There is an argument to be made that I should be doing this anyway. After all, the domain class probably should not let it be up to the caller to ensure the bidirectional association is properly defined, regardless if it is being called from JiBX or some other caller.
However there was one unintentional side affect. The project is also using Hibernate. The same domain classes were mapped using lazy associations. This change to the set method in affect turned off the laziness. The solution for this was to change the Hibernate mappings to use field access to bypass the set method.