The current code
if (!reference.isTransient() && eObject.eIsSet(reference))
buildReference(eObject, dbObject, reference);
doesnt take care about bi-directional references. This causes errors when you use EOpposites.
This code fixes the problem
if (!reference.isTransient() && eObject.eIsSet(reference)
&& !(reference.getEOpposite() != null && reference.isContainer()))
buildReference(eObject, dbObject, reference);