Problema ao gravar telefones de uma pessoa no banco

Galera, sou iniciante em JDBC. To fazendo um exemplo simples de uma agenda. O projeto em si tem 4 classes: Pessoa, Telefone, Dao e a Aplicação. Segue o código das classes:

Pessoa:

package Entidades;

import Entidades.Telefone;

import java.util.ArrayList;
import java.util.List;

public class Pessoa {
	
	private int id;
	private String nome;
	private List<Telefone> telefone = new ArrayList<Telefone>();;
	
	public Pessoa(int id, String nome) {
		
		this.id = id;
		this.nome = nome;
		
	}
	
	public int getId() {
		
		return id;
		
	}

	public void setId(int id) {
		
		this.id = id;
		
	}

	public String getNome() {
		
		return nome;
		
	}

	public void setNome(String nome) {
		
		this.nome = nome;
		
	}

	public List<Telefone> getTelefone() {
		
		return telefone;
		
	}

	public void setTelefone(List<Telefone> telefone) {
		
		this.telefone = telefone;
		
	}
	
	public void addTelefone(Telefone t){
		
		telefone.add(t);
		
	}
	
	public String toString() {
	
		return "pessoa: " + id + "-" + nome + ", telefones = " + telefone;
		
	}
	
}

Telefone:

package Entidades;

public class Telefone {
	
	private int idTelefone;
	private int idPessoa;
	private String numero;
	
	public Telefone(int idTelefone, int idPessoa, String numero) {

		this.idTelefone = idTelefone;
		this.idPessoa = idPessoa;
		this.numero = numero;
		
	}
	
	public int getIdTelefone() {
		
		return idTelefone;
		
	}

	public void setIdTelefone(int idTelefone) {
		
		this.idTelefone = idTelefone;
		
	}

	public int getIdPessoa() {
		
		return idPessoa;
		
	}

	public void setIdPessoa(int idPessoa) {
		
		this.idPessoa = idPessoa;
		
	}

	public String getNumero() {
		
		return numero;
		
	}

	public void setNumero(String numero) {
		
		this.numero = numero;
		
	}
	
	public String toString() {
		
		return numero;
		
	}

}

Dao:

package DAO;

import Entidades.Pessoa;
import Entidades.Telefone;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class Dao {
	
private static Connection con;	
	
	public static boolean abrirBanco() {
		
		if(con == null) {
			
			try {
				
				System.out.println("Iniciando a conexão com o BD...");	
				
				Class.forName("com.mysql.jdbc.Driver");
				String url= "jdbc:mysql://localhost:3306/Agenda";
				con = DriverManager.getConnection(url,"root","admin"); 		
		
				System.out.println("Banco de Dados Ok e Pronto...");
				
				return true;
				
			}
			
			catch(Exception erro) {
				
				System.out.println(erro.getMessage());
				System.out.println("Erro ao conectar ao BD: " + erro.getMessage());
				
				return false;
				
			}
			
		}
		
		return false;
		
	}
	
	public static boolean fecharBanco() {
		
		if(con != null) {
			
			try {
				
				con.close();
				System.out.println("Banco de Dados Fechado Com Sucesso...");
				
				return true;
				
			}
			
			catch(Exception erro) {
				
				System.out.println(erro.getMessage());
				System.out.println("Erro ao conectar ao BD: " + erro.getMessage());
				
				return false;
				
			}
			
		}
		
		return false;
		
	}
	
	public static boolean droparTabelas() {
		
		String sqlPessoa = "";
		String sqlTelefone = "";
		PreparedStatement st;
		int verificadorDeErroOuAcerto = 0; 
		
		try{
			
			sqlPessoa = "drop table Pessoa"; 
			st =	con.prepareStatement(sqlPessoa);
			st.executeUpdate();	
			
			verificadorDeErroOuAcerto = 1; 
			
		}
		
		catch(SQLException e) {
		
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar :" + sqlPessoa);
			
			verificadorDeErroOuAcerto = 0; 
			
		}
		
		try {
			
			sqlTelefone = "drop table Telefone"; 
			st = con.prepareStatement(sqlTelefone);
			st.executeUpdate();	
			
			verificadorDeErroOuAcerto = 1; 

		}
		
		catch(SQLException e) {
			
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar :" + sqlTelefone);
			
			verificadorDeErroOuAcerto = 0; 
			
		}
		
		if (verificadorDeErroOuAcerto == 0)
			
			return false;
		
		else 
			
			return true;

	}
	
	public static boolean gravar(Pessoa p) {
		
		String sqlPessoa = "";
		String sqlTelefone = "";
		int verificadorDeErroOuAcerto = 0;
		PreparedStatement st;
		
		try {
			
			sqlPessoa= "insert into Pessoa (nome) values (?)"; 	
			st = con.prepareStatement(sqlPessoa);
			
			st.setString(1, p.getNome());
			
			st.executeUpdate();	
			
			verificadorDeErroOuAcerto = 1;
			
		}
		
		catch(SQLException e) {
		
			System.out.println(e.getMessage());
			System.out.println("Erro ao inserir :" + sqlPessoa);
			
			verificadorDeErroOuAcerto = 0;
			
		}
		
		try {
			
			for(Telefone t : p.getTelefone()) {
				
				sqlTelefone = "insert into Telefone (numero, idPessoa) values (?, ?)"; 	
				st = con.prepareStatement(sqlTelefone);
				
				st.setString(1, t.getNumero());
				st.setInt(2, p.getId());
				
				st.executeUpdate();	
				
				verificadorDeErroOuAcerto = 1;
				
			}
			
		}
		
		catch(SQLException e) {
			
			System.out.println(e.getMessage());
			System.out.println("Erro ao inserir :" + sqlTelefone);
			
			verificadorDeErroOuAcerto = 0;
			
		}
		
		if (verificadorDeErroOuAcerto == 1) {
		
			System.out.println("Dados Incluidos com Sucesso...");
			
			return true;
			
		}
		
		else {
			
			return false;
			
		}

	}
	
	public static Pessoa localizarPessoa(int idPessoa) {
		
		String sqlPessoa = "";  
		String sqlTelefone = "";
		PreparedStatement st;
		ResultSet rs = null;
		String nome;
		Pessoa p = null;  
		String numero;
		
		try	{
			
			sqlPessoa = "select idPessoa, nome from Pessoa where idPessoa = " + idPessoa;        	
			st = con.prepareStatement(sqlPessoa);
			rs = st.executeQuery();
			
		}
			
		catch(SQLException e) {
			
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar:" + sqlPessoa);
			
		}
		
		try {
			
			if(rs.next()) {
				
				idPessoa = rs.getInt("idPessoa");
				nome = rs.getString("nome");
				p = new Pessoa(idPessoa, nome);
				p.setId(idPessoa);
				
			}
			
			sqlTelefone = "select idTelefone, numero from Telefone where idPessoa = " + idPessoa;        	
			st = con.prepareStatement(sqlTelefone);
			rs = st.executeQuery();
			
			while(rs.next()) {
				
				int idTelefone = rs.getInt("idTelefone");
				numero = rs.getString("numero");
				p.addTelefone(new Telefone(idTelefone, idPessoa, numero));
				
			}
			
			return p;

		}
		
		catch(SQLException e) {
			
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar:" + sqlTelefone);
			
		}
		
		return null;
		
	}
	
	public static ArrayList<Pessoa> listar() {
		
		int idPessoa;
		String nome;
		ArrayList<Pessoa> resultado = new ArrayList<Pessoa>();
		String sqlPessoa = "";
		String sqlTelefone = "";
		ResultSet rs = null;
		PreparedStatement st;
		
		try	{
			
			sqlPessoa = "select idPessoa, nome from pessoa";  
			st = con.prepareStatement(sqlPessoa);
			rs = st.executeQuery();
			
		}
		
		catch(SQLException e) {
		
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar:" + sqlPessoa);
			
		}
		
		try {
		
			while(rs.next()) {
				
				idPessoa = rs.getInt("idPessoa");
				nome = rs.getString("nome");
				Pessoa p = new Pessoa(idPessoa, nome);
				p.setId(idPessoa);
				resultado.add(p);
				
			}
			
			//ler os telefones de cada pessoa
			for(Pessoa p: resultado) {
				
				sqlTelefone = "select idTelefone, numero from telefone where idPessoa = " + p.getId();        	
				st = con.prepareStatement(sqlTelefone);
				rs = st.executeQuery();
				
				while(rs.next()) {
					
					int idTelefone = rs.getInt("idTelefone");
					String numero = rs.getString("numero");
					p.addTelefone(new Telefone(idTelefone, p.getId(), numero));
					
				}
				
			}
			
		}
		
		catch(SQLException e) {
			
			System.out.println(e.getMessage());
			System.out.println("Erro ao executar:" + sqlTelefone);
			
		}
		
		return resultado;
		
	}

}

Aplicação:

package Aplicacão;

import DAO.Dao;
import Entidades.Pessoa;
import Entidades.Telefone;

public class Main {
	
	public Main() {
		
		Dao.abrirBanco();
		
		Pessoa p1,p2;
		Telefone t1,t2,t3,t4;
		
		p1 = new Pessoa(1, "joao");
		p2 = new Pessoa(2, "maria");
		
		t1 = new Telefone(1, p1.getId(), "111");
		t2 = new Telefone(2, p1.getId(), "222");
		t3 = new Telefone(3, p2.getId(), "333");
		t4 = new Telefone(4, p2.getId(), "444");
		
		p1.addTelefone(t1);
		p1.addTelefone(t2);
		p2.addTelefone(t3);
		p2.addTelefone(t4);
		
		System.out.println("\n-----------objetos criados-----------");
		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println("\n-------------------------------------");
		
		Dao.gravar(p1);
		Dao.gravar(p2);
		
		Pessoa p = Dao.localizarPessoa(1);
		System.out.println("\nlocalizou --> " + p.toString());

		
		System.out.println("\n-----------listagem de Pessoas-----------");
		
		for (Pessoa pess : Dao.listar()) {
			
			System.out.println(pess.toString());
			
		}
	
		Dao.fecharBanco();

	}
	
	public static void main(String[] args) {
		
		Main ap = new Main();
		
	}

}

Querys de criação das tabelas do banco:

Pessoa:

create table Pessoa (
idPessoa INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(45) NOT NULL,
PRIMARY KEY(idPessoa));

Telefone:

create table Telefone (
idTelefone int not null auto_increment,
numero varchar(20) null,
idPessoa int not null,
primary key(idTelefone),
foreign key(idPessoa) references pessoa(idPessoa)) engine = innodb;

Quando rodo o programa aparece na console:

[b]Iniciando a conexão com o BD…
Banco de Dados Ok e Pronto…

-----------objetos criados-----------
pessoa: 1-joao, telefones = [111, 222]
pessoa: 2-maria, telefones = [333, 444]


[size=18]Cannot add or update a child row: a foreign key constraint fails (agenda.telefone, CONSTRAINT telefone_ibfk_1 FOREIGN KEY (idPessoa) REFERENCES pessoa (idPessoa))[/size]
Erro ao inserir :insert into Telefone (numero, idPessoa) values (?, ?)
[size=18]Cannot add or update a child row: a foreign key constraint fails (agenda.telefone, CONSTRAINT telefone_ibfk_1 FOREIGN KEY (idPessoa) REFERENCES pessoa (idPessoa))[/size]
Erro ao inserir :insert into Telefone (numero, idPessoa) values (?, ?)[/b]

Qual o problema de ter a falha na chave estrangeira presente em telefone?

Então é isso…

Agradeço quem puder ajudar.

Vlw!