My solution to this problem is implementing a new method called getCustomerWithAddressAndCompanyInfo
(or something else shorter) in CustomerDAO
. This method runs a single query joining customer, address and company tables and returns the result by a single access to the database.
If you choose accessing 3 DAOs, you have to execute 3 distinct queries on the database which may create a performance issue. As you said, this can cause an inconsistency also.
Another approach may be collecting such complex query methods in a separate class like CustomerQueries
rather than implementing them in existing DAO classes.