Classe dao (trabalhando com chaves estrangeiras) Ajuda por favor

Bom dia , galera to desenvolvendo para faculdade mais não só sabendo muito bem como trabalha com os métodos salvar e listar quando existe chaves estrangeira na tabelas :

alguém sabe me fala como ficaria , Ex
Tabela veiculo , tenho chaves estrangeira : idcor , idmarca ,idnportas , idcat , idmodelo
preciso salvar atributos para todos mais não estou conseguindo , se realizo o insert sem as chaves estrangeiras funciona normal .
Segue imagem em anexo .

Alguém consegue me ajuda ???

Segue o CLASSE DAO

public class CarroDao {

public void excluir(Carro c) throws SQLException {
	StringBuilder sql = new StringBuilder();
	sql.append("DELETE FROM veiculo WHERE idveiculo = ?");
	
	
	 Connection conexao = Conexaofactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setInt(1, c.getCodigo() ); 
	
	comando.executeUpdate();
			
	
}
 /**INSERE DADOS NA TABELA veiculo**/


public void salvar(Carro c) throws SQLException {

	StringBuilder sql = new StringBuilder();
	sql.append("INSERT INTO veiculo (placa, renavam, chassi, anofab) ");
	sql.append("VALUES (?,?,?,?)");

	
	Connection conexao = Conexaofactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	comando.setString  (1, c.getPlaca());
	comando.setString  (2, c.getRenavam());
	comando.setString  (3, c.getChassi());
	comando.setString  (4, c.getAno());
	
	comando.executeUpdate();
	

	
	StringBuilder sql2 = new StringBuilder();
	
	sql2.append("INSERT INTO cor (descricao) ");
	sql2.append("VALUES (?)");
	PreparedStatement comando2 = conexao.prepareStatement(sql2.toString());
	comando2.setString  (1, c.getCor());
	comando2.executeUpdate();
	

	StringBuilder sql3 = new StringBuilder();
	
	sql3.append("INSERT INTO marca (descricao) ");
	sql3.append("VALUES (?)");
	PreparedStatement comando3 = conexao.prepareStatement(sql3.toString());
	comando3.setString  (1, c.getMarca());
	comando3.executeUpdate();
	

	

	StringBuilder sql4 = new StringBuilder();
	
	sql4.append("INSERT INTO nportas (descricao) ");
	sql4.append("VALUES (?)");
	PreparedStatement comando4 = conexao.prepareStatement(sql4.toString());
	comando4.setString  (1, c.getNportas());
	comando4.executeUpdate();
	
    

    StringBuilder sql5 = new StringBuilder();
	
	sql5.append("INSERT INTO categoria (descricao) ");
	sql5.append("VALUES (?)");
	PreparedStatement comando5 = conexao.prepareStatement(sql5.toString());
	comando5.setString  (1, c.getCategoria());
	comando5.executeUpdate();
	
	

    StringBuilder sql6 = new StringBuilder();
	
	sql6.append("INSERT INTO modelo (descricao) ");
	sql6.append("VALUES (?)");
	PreparedStatement comando6 = conexao.prepareStatement(sql6.toString());
	comando6.setString  (1, c.getModelo());
	comando6.executeUpdate();
	
	
	
	
}

public void salvarcor (Carro c ) throws SQLException {
	
	
	
	
	
	
}


public void editar (Carro c) throws SQLException {
	
	
	StringBuilder sql = new StringBuilder();
	
	sql.append("UPDATE veiculo ");
	sql.append("SET  placa = ? , renavam = ? , chassi = ? , anofab = ? ");
	sql.append("WHERE idveiculo = ?");
	
	
    Connection conexao = Conexaofactory.conectar();
	
	PreparedStatement comando = conexao.prepareStatement(sql.toString());
	
	comando.setString (1, c.getPlaca());
	comando.setString (2, c.getRenavam());
	comando.setString (3, c.getChassi());
	comando.setString (4, c.getAno());
	comando.setInt    (5, c.getCodigo());
	
	comando.executeUpdate();
	

	StringBuilder sql2 = new StringBuilder();
	
	sql2.append("UPDATE cor ");
	sql2.append("SET  descricao = ? ");
	sql2.append("WHERE idcor = ?");
	
	
	PreparedStatement comando2 = conexao.prepareStatement(sql2.toString());
	
	comando2.setString (1, c.getCor());
	
	
	comando.executeUpdate();
	
	
	
	
  StringBuilder sql3 = new StringBuilder();
	
	sql3.append("UPDATE marca ");
	sql3.append("SET  descricao = ? ");
	sql3.append("WHERE idmarca = ?");
	
	
	PreparedStatement comando3 = conexao.prepareStatement(sql3.toString());
	
	comando3.setString (1, c.getMarca());
	
	
	comando3.executeUpdate();


	
	 StringBuilder sql4 = new StringBuilder();
		
		sql4.append("UPDATE nportas ");
		sql4.append("SET  descricao = ? ");
		sql4.append("WHERE idportas = ?");
		
		
		PreparedStatement comando4 = conexao.prepareStatement(sql3.toString());
		
		comando4.setString (1, c.getNportas());
		
		
		comando4.executeUpdate();
		
		
		
		    StringBuilder sql5 = new StringBuilder();
			
			sql5.append("UPDATE categoria ");
			sql5.append("SET  descricao = ? ");
			sql5.append("WHERE idcat = ?");
			
			
			PreparedStatement comando5 = conexao.prepareStatement(sql5.toString());
			
			comando5.setString (1, c.getCategoria());
			
			
			comando5.executeUpdate();
	
           
				
				
				
				    StringBuilder sql6 = new StringBuilder();
					
					sql6.append("UPDATE modelo ");
					sql6.append("SET  descricao = ? ");
					sql6.append("WHERE idmodelo = ?");
					
					
					PreparedStatement comando6 = conexao.prepareStatement(sql6.toString());
					
					comando6.setString (1, c.getModelo());
					
					
					comando6.executeUpdate();
			


}
  
public Carro buscaporcodigo(Carro c) throws SQLException {
	
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT  idveiculo, placa , renavam , chassi , anofab ");
	sql.append("FROM  veiculo ");
	sql.append("WHERE idveiculo = ?");
	
	
	
	
    Connection conexao = Conexaofactory.conectar();
	
    PreparedStatement comando = conexao.prepareStatement(sql.toString());

	comando.setInt  (1, c.getCodigo());
	
	ResultSet resultado = comando.executeQuery();
	Carro retorno  = null ;
	
	if (resultado.next()) {
		retorno = new Carro();
		
		retorno.setCodigo(resultado.getInt("idveiculo"));
		retorno.setPlaca(resultado.getString("placa"));
		retorno.setRenavam(resultado.getString("renavam"));
		retorno.setChassi (resultado.getString("chassi"));
		retorno.setAno  (resultado.getString("anofab"));
	}
	
	
	return retorno;

	
}

public ArrayList<Carro>buscarporPlaca(Carro c)throws SQLException {
	
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT  idveiculo, placa , renavam , chassi , anofab ");
	sql.append("FROM  veiculo ");
	sql.append("WHERE placa LIKE ? ");

	
    Connection conexao = Conexaofactory.conectar();
	
    PreparedStatement comando = conexao.prepareStatement(sql.toString());
    
    comando.setString(1,"%" + c.getPlaca() + "%");
	
	ResultSet resultado = comando.executeQuery();
   
	ArrayList<Carro>lista = new ArrayList<Carro>();
	
	    while(resultado.next()){
		Carro item = new Carro();
		c.setCodigo(resultado.getInt("idveiculo")) ;
		c.setPlaca(resultado.getString("placa")) ;
		c.setRenavam(resultado.getString("renavam")) ;
		c.setChassi(resultado.getString("chassi")) ;
		c.setAno(resultado.getString("anofab")) ;

	

		
		lista.add(item);
	}
	
  return lista;
	
	
}



public ArrayList<Carro> listar () throws SQLException{
	
	
	
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT idveiculo, placa , renavam , chassi , anofab , cor.descricao as 'c.descricao', marca.descricao as 'marca_descricao',nportas.descricao as 'nportas_descricao',categoria.descricao as 'categoria_descricao',modelo.descricao as 'modelo_descricao' ");
	
	sql.append("FROM  veiculo ");
	sql.append ("INNER JOIN cor ON v.idcor = c.idcor;");
	sql.append ("INNER JOIN marca ON marca.idmarca=marca.idmarca ");
	sql.append ("INNER JOIN nportas ON nportas.idnportass=nportas.idnportas ");
	sql.append ("INNER JOIN categoria ON categoria.idcat=categoria.idcat ");
	sql.append ("INNER JOIN modelo ON modelo.idmodelo=modelo.idmodelo ");
	sql.append("ORDER BY placa,renavam,chassi,anofab, c.descricao , marca.descricao, nportas.descricao,categoria.descricao,modelo.descricao ASC ");
	
	
    Connection conexao = Conexaofactory.conectar();
	
    PreparedStatement comando = conexao.prepareStatement(sql.toString());

	ResultSet resultado = comando.executeQuery();

	
     ArrayList<Carro>lista = new ArrayList<Carro>();
	
	 while(resultado.next()){
		Carro c = new Carro();
		c.setCodigo(resultado.getInt("idveiculo")) ;
		c.setPlaca(resultado.getString("placa")) ;
		c.setRenavam(resultado.getString("renavam")) ;
		c.setChassi(resultado.getString("chassi")) ;
		c.setAno(resultado.getString("anofab")) ;
		c.setCor(resultado.getString("cor.descricao")) ; 
		c.setMarca(resultado.getString("marca_descricao")) ;
		c.setNportas(resultado.getString("nportas_descricao")) ;
		c.setCategoria(resultado.getString("categoria_descricao")) ;
		c.setModelo(resultado.getString("modelo_descricao")) ;
		
		lista.add(c);
	
	}
  return lista;
	 }
}

CLASSE CARRO

public class Carro {
private int codigo;
private String placa;
private String renavam;
private String chassi;
private String ano;
private String cor;
private String marca;
private String nportas;
private String categoria;
private String modelo;

public int getCodigo() {
return codigo;
}

public void setCodigo(int codigo) {
this.codigo = codigo;
}

public String getPlaca() {
return placa;
}

public void setPlaca(String placa) {
this.placa = placa;
}

public String getRenavam() {
return renavam;
}

public void setRenavam(String renavam) {
this.renavam = renavam;
}

public String getChassi() {
return chassi;
}

public void setChassi(String chassi) {
this.chassi = chassi;
}

public String getAno() {
return ano;
}

public void setAno(String ano) {
this.ano = ano;
}

public String getCor() {
return cor;
}

public void setCor(String cor) {
this.cor = cor;
}

public String getMarca() {
return marca;
}

public void setMarca(String marca) {
this.marca = marca;
}

public String getNportas() {
return nportas;
}

public void setNportas(String nportas) {
this.nportas = nportas;
}

public String getCategoria() {
return categoria;
}

public void setCategoria(String categoria) {
this.categoria = categoria;
}

public String getModelo() {
return modelo;
}

public void setModelo(String modelo) {
this.modelo = modelo;
}

@Override

public String toString() {
	
String  saida = codigo + " - "+ placa + " - "+ renavam + " - "+ chassi + " - "+ ano +" - "+ cor +" - "+ marca +" - " + nportas +" - "+ categoria + " - "+ modelo;

	return saida;
}

}

CLASSE BEAN

public class CarroBean {

private ArrayList <Carro> itens;
private ArrayList <Carro> itensfiltrados;
private Carro carro;




public ArrayList<Carro> getItens() {
	return itens;
}


public void setItens(ArrayList<Carro> itens) {
	this.itens = itens;
}


public ArrayList<Carro> getItensfiltrados() {
	return itensfiltrados;
}


public void setItensfiltrados(ArrayList<Carro> itensfiltrados) {
	this.itensfiltrados = itensfiltrados;
}





@PostConstruct
public void PrepararPesquisa () {

   try {
		   CarroDao cdao = new CarroDao();
		 itens = cdao.listar();
		JSFUtil.adicionarMensagemErro("Ex.getMessage()");
	} catch (SQLException e) {
		
		e.printStackTrace();
	}
    
   
}


  /*
		 * Abaixo e feito a parte de atualização da lista automatica na tela de Pesquisa veiculo
		 */
   public void prepararnovo() {
	   carro = new Carro();
    	   
   }
   

 
   public void novo() {
	  
     try {
    	 
    	CarroDao cdao = new CarroDao();
		cdao.salvar(carro);
		
		itens = cdao.listar();
		
        
        JSFUtil.adicionarMensagemSucesso("Salvo com Sucesso");
		
	} catch (SQLException e) {
		JSFUtil.adicionarMensagemErro("Ex.getMessage()");
		e.printStackTrace();
	}	   

   }
   
   
 
	  

   
	   public void excluir () {
		   
		   try {
		    	 
		    	CarroDao cdao = new CarroDao();
				cdao.excluir(carro);
				
				itens = cdao.listar();
	         
	            
	            JSFUtil.adicionarMensagemSucesso("Exclusão realizada com sucesso");
				
			} catch (SQLException e) {
				JSFUtil.adicionarMensagemErro("Ex.getMessage()");
				e.printStackTrace();
			}	   
		  
	
	   }
	   
	   
	 

		   public void editar () {
			   
			   try {
			    	 
			    	CarroDao cdao = new CarroDao();
					cdao.editar(carro);
					
					itens = cdao.listar();
		            
		            
		            JSFUtil.adicionarMensagemSucesso("Edição realizada com sucesso");
					
				} catch (SQLException e) {
					JSFUtil.adicionarMensagemErro("Ex.getMessage()");
					e.printStackTrace();
				}	   
			  
		
		   }
	   
  
	


public Carro getCarro() {
	return carro;
}

public void setCarro(Carro carro) {
	this.carro = carro;
}

}

Olá, pelo que entendi este seria o código que funciona, mas pra ajudar vc precisa postar aquele que não funciona e explicar exatamente OQUE n funciona, com o PORQUE nós te ajudamos. Se é erro que dá, é essencial postar o stacktrace dele.

Quando você usa JDBC puro, você, obrigatoriamente, deve tratar as chaves de maneira manual.
Como assim?
Por exemplo, considere as classes Mae e Filho, cada mãe possui nenhum ou, no máximo, vários filhos e cada filho possui, obrigatoriamente, uma única mãe.

public class Mae {
    private String nome;
    private Long id;
}

public class Filho {
    private Long id;
    private Long idMae;
    private String nome;
}

Quando você vai salvar uma mãe, você usa a seguinte query:

INSERT INTO mae VALUES (nome);

Alguns bancos de dados conseguem retornar o id através de uma função como o LAST_INSERT_ID(), porém, se você usa MySQL, tal função não existe.
Logo, você precisa de um select como

SELECT max(id) FROM mae;

Porém, se você possui um número muito grande de inserções, há grandes chances de poder pegar o id incorreto. Daí seria necessário colocar parâmetros na pesquisa, para mitigar esse risco:

SELECT max(id) FROM mae WHERE nome = ?;

A partir do momento que você obtém o id, aí sim, você deverá setar e realizar a inserção dos valores na tabela que depende de tal informação

INSERT INTO filho VALUES (idMae, nome)

Vou ter que discordar em partes, manual sim, mas sempre Orientado a Objeto. A classe filho possui um objeto Mae.
Já que vai ser manual mesmo, nada impede de vc usar filho.mae.id… claro que precisa instanciar antes e se for em buscas talvez precise fazer uma busca separada ou unir os campos na mesma, mesmo assim não será mais pessado q o hibernate.

Ah, verdade. Eu vacilei nesse aspecto sim.