Boa tarde.
Geralmente eu crio uma classe VO (value object), ou TO(transfer object) vai de cada um.
Crio CidadeVO e EstadoVO
A CidadeVO contem um atributo do tipo EstadoVO, quando carrega o objeto cidade no DAO você também faz um select no EstadoVO e já carrega ele se precisar (tem que ficar atento nestas questões devido performance).
Faço uma classe DAO para cada classe VO, EstadoDAO, CidadeDAO.
Ai implemento as partes de select com o banco, update, etc…
Método por exemplo, selectCidadeById(Long id), que busca as cidades conforme o id passado.
Ou selectCidadesEstado(Long idEstado), retorna todas as cidades do estado.
Este tipo de implementação é basica, você teria que verificar a viabilidade de utilizar algum framework de persistencia, tipo o hibernate por exemplo.
Para projetos pequenos eu gosto de fazer tudo via sql, pois a performance é melhor e é mais simples.
Qualquer dúvida estou a disposição.