👣 Full Scenario (with the circle drawn)

1. PersonService uses PersonMapper


@Service
public class PersonService {
    private final PersonMapper personMapper;

    public PersonService(PersonMapper personMapper) {
        this.personMapper = personMapper;
    }
}

➡️ PersonService → PersonMapper


2. PersonMapper uses EntityResolverService


@Mapper(componentModel = "spring", uses = EntityResolverService.class)
public interface PersonMapper {
    @Mapping(source = "lastProjectId", target = "lastProject", qualifiedByName = "projectFromId")
    Person toEntity(PersonDTO dto);
}

➡️ PersonMapper → EntityResolverService


3. EntityResolverService uses ProjectRepository


@Component
public class EntityResolverService {
    
    @Autowired
    private ProjectRepository projectRepository;
    
    @Autowired
    private PersonRepository personRepository;

    public Project projectFromId(UUID id) {
        return projectRepository.findById(id).orElseThrow(...);
    }
}

➡️ EntityResolverService → ProjectRepository


4. ProjectRepository is used by ProjectService


@Service
public class ProjectService {
    @Autowired
    private ProjectRepository projectRepository;
}

➡️ ProjectRepository → ProjectService


5. ProjectService uses ProjectMapper

java
CopyEdit
@Service
public class ProjectService {
    private final ProjectMapper projectMapper;

    public ProjectService(ProjectMapper projectMapper, ProjectRepository repo) {
        this.projectMapper = projectMapper;
    }
}

➡️ ProjectService → ProjectMapper