There are two ways this could be meant:
I end up with cyclic dependencies that make the application impossible to load
As you have already experienced, defining the bidirectional dependency in the database could lead to unexpected performance drops because with a high-connected graph, SDN will fetch "everything" that is reachable.
For your situation, there is a projection feature in place, that allows you to define interfaces that only reflect a sub-set of the defined global model.
This is due to the fact that Jackson will chase every reachable field and SoftwareComponent
->SoftwareComponent
->Software...
is an infinite self-referencing loop. To break out of this, the mentioned answer I gave about the use of Jackson (thanks @cybersam for finding this link already) is still valid.