Hibernate - Refatoração de código [Resolvido]

Olá pessoal,
sou iniciante em Hibernate e gostaria que vocês dessem uma olhada no esquema abaixo e se puderem me ajudarem a chegar numa técnica ou forma de melhorar o codigo da minha aplicação de exemplo.

Tenho uma entidade Pais, Estado e Cidade.
Cada uma dessas entidades tem os seguintes mapeamentos:

Pais.hbm.xml


    <hibernate-mapping>
   		<class name = "territorio.model.entity.Pais" table="pais">
   			<id name = "id" type = "java.lang.Integer">
   				<column name="idPais" />
   				<generator class="native" />
   			</id>
   			<property name="nome" type="string">
            	<column name="nomePais" />
        	</property>
        	<property name="sigla" type="string">
            	<column name="siglaPais" />
        	</property>
   		</class>
   		
    </hibernate-mapping>

Estado.hbm.xml

    <hibernate-mapping>
    
   		<class name = "territorio.model.entity.Estado" table="estado">
   			<id name = "id" type = "java.lang.Integer">
   				<column name="idEstado" />
   				<generator class="native" />
   			</id>
   			<property name="nome" type="string">
            	<column name="nomeEstado" />
        	</property>
        	<property name="sigla" type="string">
            	<column name="siglaEstado" />
        	</property>
        	
        	<many-to-one
        		class = "territorio.model.entity.Pais" 
        		name = "pais"
        		column="idPais"
        	/>
   		</class>
    </hibernate-mapping>

E meu arquivo Hibernate.cfg.xml

    <hibernate-configuration>
        <session-factory>
            <property name = "connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <property name = "connection.url">
                jdbc:mysql://localhost:3306/appexample
            </property>
            <property name = "connection.username">
                root
            </property>
            <property name = "connection.password">
                
            </property>
            <property name = "dialect">
                org.hibernate.dialect.MySQLDialect
            </property>
            <property name = "show_sql">
            	true
            </property>
            
            
            <mapping resource="territorio/model/repository/hibernate/hbm/Pais.hbm.xml" />
            <mapping resource="territorio/model/repository/hibernate/hbm/Estado.hbm.xml" />

        </session-factory>
    </hibernate-configuration>

Fiz a Classe HibernateUtil, que é responsável por fornecer a session, e as Classes PaisDAO e EstadoDAO que funcionam corretamente.
Minha dúvida é em relação as classes de serviço, que são responsável por chamar os DAOs e retornar as Entidades.

Fiz um serviço para encontrar um determinado estado, no entanto tive que chamar o serviço para carregar o pais e agregar-lo junto ao objeto Estado que será retornado:

	public Estado findByIdEstadoService(Estado estado) throws HibernateException
	{
	      Estado e;	
              try 
		{
                        e = estadoDAO.findById(estado);
                        e.setPais(paisService.findByIdService(estado.getPais());
			return e;
			
		} catch (HibernateException e) 
		{
			throw new HibernateException(e.getMessage() + " - Erro ao procurar pais");
		}
		
	}

Isso parece meio feio, já que se precisar recuperar a lista de todos os estados cadastrados, dessa forma teria que percorrer a lista e procurar no paisService cada pais de cada elemento estado da lista.

Gostaria de ver a sugestão dos colegas em formas ou técnicas melhor para recuperar o Pais de um estado sem ter que fazer isso da forma como está acima.

Obrigado

Meu Deus,
estou lendo o livro Manning Java Persistense with Hibernate e só vi agora as opções Lazy, FecthMode e a afins…
Principiante é fogo…
:smiley:

Puts, mapeando com XML. Recomendo vc utilizar as anotações para mapear. A dica é da uma pesguisada sobre hibernate tools ele gera o mapeamento automaticamente.

sds (nao esquece de colocar como resolvido.)