JSP, JSTL e Foreign key

Bom dia pessoal!
Depois de muito tentar e pesquisar, infelizmente não consegui a solução.
Estou tentando inserir os dados de uma tabela que contém uma foreign_key através do formulário, mas infelizmente, sem sucesso!
Preciso da ajuda de vocês para aprender mais essa lição.

Essa é minha classe PaisDAO


package br.com.homologacao.jdbc.modelo.local.dao;

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

import br.com.homologacao.jdbc.ConnectionFactory;
import br.com.homologacao.jdbc.modelo.local.Pais;

public class PaisDAO {


	private Connection connection;

	public PaisDAO(){
		this.connection = new ConnectionFactory().getConnection();
	}

	public PaisDAO(Connection connection){
		this.connection = connection;
	}


	public void adiciona(Pais pais){

		try {

			PreparedStatement stmtAdiciona = connection.prepareStatement(sqlAdiciona);

			stmtAdiciona.setString(1, pais.getNome().toUpperCase());
			stmtAdiciona.setString(2, pais.getSigla().toUpperCase());


	
			stmtAdiciona.execute();
			stmtAdiciona.close();
			connection.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}

	//	Método para alterar País.
	public void alteraPais(Pais pais){
		String sqlAltera = "update pais set nome=?, sigla=? where codigo=?";
		
		try {
			PreparedStatement stmtAltera = connection.prepareStatement(sqlAltera);
			stmtAltera.setString(1, pais.getNome().toUpperCase());
			stmtAltera.setString(2, pais.getSigla().toUpperCase());
			stmtAltera.setLong(3, pais.getId());
			
			stmtAltera.execute();
			//stmtAltera.close();
			//connection.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}

	}

	//	Método para remover País.
	public void removePais(Pais pais){
		String sqlRemove = "delete from pais where codigo=?";

		try {
			PreparedStatement stmtRemove = connection.prepareStatement(sqlRemove);

			stmtRemove.setLong(1, pais.getId());

			stmtRemove.execute();
			stmtRemove.close();
			connection.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}

	//	Método para Listar todos os Países do Banco de Dados.
	public List<Pais> getLista(){

		try {
			ArrayList<Pais> pais = new ArrayList<Pais>();
			String sqlLista = "select * from pais";

			PreparedStatement stmtLista = this.connection.prepareStatement(sqlLista);
			ResultSet rs = stmtLista.executeQuery();

			while(rs.next()){
				Pais paises = new Pais();
				paises.setId(rs.getLong("codigo"));
				paises.setNome(rs.getString("nome"));
				paises.setSigla(rs.getString("sigla"));

				pais.add(paises);
			}
			rs.close();
			stmtLista.close();
			connection.close();

			return pais;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}

	}


	public List<Pais> getId(Long id){

		try {
			ArrayList<Pais> pais = new ArrayList<Pais>();
			String sqlId = "select * from pais";

			PreparedStatement stmtId = this.connection.prepareStatement(sqlId);
			ResultSet rs = stmtId.executeQuery();

			while(rs.next()){
				if(id == rs.getLong("codigo")){
					Pais paises = new Pais();
					paises.setId(rs.getLong("codigo"));
					paises.setNome(rs.getString("nome"));
					paises.setSigla(rs.getString("sigla"));

					pais.add(paises);
				}

			}
			return pais;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}
}

E Agora a classe EstadoDAO

package br.com.homologacao.jdbc.modelo.local.dao;

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

import br.com.homologacao.jdbc.ConnectionFactory;
import br.com.homologacao.jdbc.modelo.local.Estado;
import br.com.homologacao.jdbc.modelo.local.Pais;

public class EstadoDAO {

	private Connection connection;

	public EstadoDAO(){
		this.connection = new ConnectionFactory().getConnection();
	}

	public EstadoDAO(Connection connection){
		this.connection = connection;

	}

	public void adiciona(Estado estado){

		String sqlAdiciona = "insert into estado (nome, sigla, pais) values (?, ?, ?)";

		try {


			PreparedStatement stmtAdiciona = connection.prepareStatement(sqlAdiciona);

			stmtAdiciona.setString(1, estado.getNome().toUpperCase());
			stmtAdiciona.setString(2, estado.getSigla().toUpperCase());
			stmtAdiciona.setLong(3, estado.getPais().getId());

			stmtAdiciona.execute();
			stmtAdiciona.close();
			connection.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}

	public void altera(Estado estado){

		String sqlAltera = "update estado set nome=?, sigla=?, pais=? where codigo=?";

		try {
			PreparedStatement stmtAltera = connection.prepareStatement(sqlAltera);

			stmtAltera.setString(1, estado.getNome().toUpperCase());
			stmtAltera.setString(2, estado.getSigla().toUpperCase());
			stmtAltera.setLong(3, estado.getPais().getId());
			stmtAltera.setLong(4, estado.getId());

			stmtAltera.execute();
			stmtAltera.close();
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}

	}

	public void remove(Estado estado){

		String sqlRemove = "delete from estado where codigo=?";

		try {
			PreparedStatement stmtRemove = connection.prepareStatement(sqlRemove);
			
			stmtRemove.setLong(1, estado.getId());

			stmtRemove.execute();
			stmtRemove.close();
			connection.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}

	public List<Estado> getLista(){

		try {
			ArrayList<Estado> estados = new ArrayList<Estado>();
			String sqlLista = "select e.codigo, e.nome, e.sigla, p.nome from estado e " +
					"join pais p on e.pais = p.codigo";

			PreparedStatement stmlLista = connection.prepareStatement(sqlLista);
			ResultSet rs = stmlLista.executeQuery();

			while(rs.next()){
				Estado estado = new Estado();

				estado.setId(rs.getLong("e.codigo"));
				estado.setNome(rs.getString("e.nome"));
				estado.setSigla(rs.getString("e.sigla"));
				estado.setPais(new Pais(rs.getString("p.nome")));

				estados.add(estado);
			}
			rs.close();
			stmlLista.close();
			connection.close();

			return estados;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}

	}
	
	public List<Estado> getId(Long id){
		
		ArrayList<Estado> estado = new ArrayList<Estado>();
		String sqlId = "select * from estado e join pais p on e.pais = p.codigo";
		
		try {
			PreparedStatement stmtId = connection.prepareStatement(sqlId);
			ResultSet rs = stmtId.executeQuery();
			
			while(rs.next()){
				if(id == rs.getLong("e.codigo")){
					Estado estados = new Estado();
					estados.setId(rs.getLong("e.codigo"));
					estados.setNome(rs.getString("e.nome"));
					estados.setSigla(rs.getString("e.sigla"));
					estados.setPais(new Pais(rs.getString("p.nome")));
				}
				
			}
			return estado;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}
}

A questão agora é: Por que não estou conseguindo enviar os dados do meu formulário *.jsp para o banco de dados.
Seguem o formulário e também a servlet.


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<jsp:useBean id="dao" class="br.com.homologacao.jdbc.modelo.local.dao.PaisDAO"></jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Adiciona Estado - Homologação</title>
</head>
<body>

	<table align="center" border="1">
		<tr>
			<td>Sistema de Homologação
		</tr>
	</table>

	<h3>Inserindo um novo Estado - Sistema de Homologação</h3>
	
	<form:errors path="estado.nome" cssStyle="color:red" />
	<form:errors path="estado.sigla" cssStyle="color:red"/>
	<form action="adicionaEstado" method="post">
		Nome:	<input type="text" name="nome" />
		<br />
		Sigla:	<input type="text" name="sigla" />
		<br />
		País:	<select name="pais" id="pais">
					<option value="0" id="pais">Selecione o País </option>
						<c:forEach items="${dao.lista}" var="pais">
							<option value="${pais.id}" id="${pais.id}" >${pais.nome} </option>
						</c:forEach>
				</select>
		<br />
	<input type="submit" value="Adicionar"/>
	</form>
	<a href="listaEstado"> <input type="button" value="Lista Estado"/></a>
</body>
</html>
package br.com.homologacao.jdbc.modelo.spring.controller.local;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.homologacao.jdbc.modelo.local.Estado;
import br.com.homologacao.jdbc.modelo.local.Pais;
import br.com.homologacao.jdbc.modelo.local.dao.EstadoDAO;

@Controller
public class EstadoController {
	
	@RequestMapping("novoEstado")
	public String form(){
		return"local/estado/adicionaEstado";
		
	}
	
	@RequestMapping("adicionaEstado")
	public String adiciona(Estado estado, BindingResult result{
		EstadoDAO estadoDAO = new EstadoDAO();
		Pais pais = new Pais();
		Long id = pais.getId();
		pais.setId(id);
		estado.setPais(pais);
		estadoDAO.adiciona(estado);
		return"local/estado/estadoAdicionado";
	}
	
	@RequestMapping("listaEstado")
	public String lista(Model model){
		EstadoDAO estadoDAO = new EstadoDAO();
		model.addAttribute("estados", estadoDAO.getLista());
		return "local/estado/listaEstado";
	}
}

Na classe Estado tem uma foreign_key (private Pais pais) referenciando (private long id) da classe País
Pessoal, se não puderem mandar o código, pelo menos mandem a ideia. O importante pra mim é aprender e não somente fazer.
Estou fazendo um projeto de cadastros somente para efeitos de estudo.
Agradeço a todos!

Mas esse “não dá certo” = ???
Afinal, não entendi o que você quer fazer.
E que diabos tem a ver jsp/jstl com a foreign key?

O que está acontecendo é que: quando eu acesso o formulário e tento enviar os dados,

Acontece o seguinte erro.


HTTP Status 500 - Request processing failed; nested exception is java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`homologacao`.`estado`, CONSTRAINT `fk_estado_pais` FOREIGN KEY (`pais`) REFERENCES `pais` (`codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Como se o campo do País não estivesse enviando o código do País para o Banco de Dados.

O valor da chave para o PAIS está invalido

Veja o SQL principal que você está gerando, o valor que você passa para o campo país tem que estar cadastrado na tabela de paises do banco de dados.

Abs