Perhaps when building a toString() method (or equivalent) we should evaluate each accessor's return type and then query for BeanInfoMetadata. If the BeanInfoMetadata for the return type includes the return type we are generating the toString() for, query for EntityMetadata to determine if an accessor method is available (in which case the accessor method can be outputted for that type). If no EntityMetadata is available, just output whether the related object is null or non-null. This seems a relatively fail-safe approach to avoiding circular dependencies and still provides as much information as is reasonably possible to offer. Please feel free to discuss with me if you have any other ideas on how to tackle this. Other alternatives include maintaining a ThreadLocal with a Set of objects already outputted to detect a circular reference or using AspectJ pointcut to make a similar detection. I'm not a big fan of these given the memory consumption and performance impact, though.