FetchType.LAZY

Senhores,
Estou estudando JPA e tenho as seguintes Entidades:

@Entity
@Table(name="estado")
public class Estado {
	@Id
	@GeneratedValue
	@Column(name="est_id")
	private int id;
	@Column(name="est_uf")
	private String est;
	@Column(name="est_nome")
	private String nome;	
	@OneToMany(mappedBy="estado",fetch=FetchType.LAZY)
	private List<Cidade> listCidades;
	public List<Cidade> getListCidades() {
		return listCidades;
	}
	public void setListCidades(List<Cidade> listCidades) {
		this.listCidades = listCidades;
	}
	public String getEst() {
		return est;
	}
	public void setEst(String est) {
		this.est = est;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}
@Entity
@Table(name="cidade")
public class Cidade {
	@Id
	@GeneratedValue
	@Column(name="cid_id")
           private int id;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="est_fk")
         private Estado estado;
       @Column(name="cid_nome")
       private String nome;
	public Estado getEst() {
		return estado;
	}
	public void setEst(Estado est) {
		this.estado = est;
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}	
}

Tenho a classe abaixo para fazer uma busca:

public class Conectar {

	public static void main(String[] args) {
		Session s=null;
		
		try{
		 	s = HibernateUtil.getSession().openSession();
	        System.out.println("ok"+s.toString());
	        Estado estado = (Estado) s.get(Estado.class, 1);
	        System.out.println("1 NIVEL ESTADO "+estado.getNome());
	        for(Cidade c:estado.getListCidades()){
	        	System.out.println("1 CIDADE "+c.getNome());
	        	Estado estado1=c.getEst();
	        	System.out.println(" 2 NIVEL ESTADO "+estado1.getNome());
	        	for(Cidade c1:estado1.getListCidades()){
	        		System.out.println("2 CIDADE "+c1.getNome());
	        		Estado e3 = c1.getEst();
	        		System.out.println("3 NIVEL ESTADO "+e3.getNome());
	        		for(Cidade c2:e3.getListCidades()){
	        			System.out.println("3 CIDADE "+c2.getNome());
	        		}
	        	}
	        	
	        }	        
	        
		}finally{
			System.out.println("fechei"+s.close());
		}
	}
}

Pelo que estavo lendo o tipo Lazy não deveria buscar as cidades, mas além de buscar as cidades ele busca tudo!!!
Além do mais a busca entra em loop e como tenho uma Estado com várias cidades e essas cidades tem estados, sempre consigo buscar mais cidades!!! Como para com isso?

Não entendi o seu problema.

o tipo LAZY faz com que as cidades não sejam buscadas até que você as use, no momento em que você invoca o método getCidades() ele irá buscá-las do banco (caso tenha uma sessão aberta).