Dificuldades como tratar as FK (Foreink com java) em java

12 respostas Resolvido
P

Ola! Estou com muita dificuldades em como tratar FK com java.
Tenho algumas tabelas mas estou fazendo por partes a principio tenho duas
Alunos e Matricula sendo que a matricula tem uma FK segue abaixo o SQL

CREATE TABLE IF NOT EXISTS matriculas (
Mat_Aluno int(4) NOT NULL,
Cod_Turma int(4) NOT NULL,
Valor float(9,2) NOT NULL,
Data date NOT NULL,
PRIMARY KEY (Mat_Aluno,Cod_Turma),
KEY Cod_Turma (Cod_Turma),
CONSTRAINT matriculas_ibfk_1 FOREIGN KEY (Mat_Aluno) REFERENCES alunos (Matricula),
CONSTRAINT matriculas_ibfk_2 FOREIGN KEY (Cod_Turma) REFERENCES turmas (Codigo_Turma)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

12 Respostas

P
import java.util.Date;

public class Matriculas {

private int Mat_Aluno;
private int Cod_Turma;
private int valor;
private Date Data = new Date();
private Alunos aluno;



public Alunos getAluno() {
	return aluno;
}
public void setAluno(Alunos aluno) {
	this.aluno = aluno;
}
public int getMat_Aluno() {
	return Mat_Aluno;
}
public void setMat_Aluno(int mat_Aluno) {
	Mat_Aluno = mat_Aluno;
}

public int getCod_Turma() {
	return Cod_Turma;
}
public void setCod_Turma(int cod_Turma) {
	Cod_Turma = cod_Turma;
}

public int getValor() {
	return valor;
}
public void setValor(int valor) {
	this.valor = valor;
}

public Date getData() {
	return Data;
}
public void setData(Date data) {
	Data = data;
}

}


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;

import br.com.polegario.sabetudo.Alunos;
import br.com.polegario.sabetudo.ConnectionFactory;
import br.com.polegario.sabetudo.Matriculas;

public class MatriculasDao {

public void salvar(Matriculas matriculas) {

	String sql = "insert into matriculas(Mat_Aluno,Cod_Turma,Valor,Data)"
			+ "values(?,?,?,?)";

	Connection connection = ConnectionFactory.getConnection();
	PreparedStatement prepareStatement = null;

	try {

		prepareStatement = connection.prepareStatement(sql);
		
		prepareStatement.setInt(1, matriculas.getMat_Aluno());
		prepareStatement.setInt(2, matriculas.getCod_Turma());
		prepareStatement.setInt(3, matriculas.getValor());
		prepareStatement.setTimestamp(4, new Timestamp(matriculas.getData().getTime()));
		
		
		prepareStatement.executeUpdate();

	} catch (SQLException e) {
		throw new RuntimeException(e);

	} finally {

		try {

			if (prepareStatement != null && !prepareStatement.isClosed()) {
				prepareStatement.close();
			}

			if (connection != null && !connection.isClosed()) {
				connection.close();
			}

		} catch (SQLException e) {

			throw new RuntimeException(e);

		}

	}

}

}
J

Você falou que tem dificuldades, mas não falou onde. É para olhar o teu codigo e brincar de descobre erros?

T

@paulopolegario, eu acho que entendi sua dúvida.

Fica tranquilo! Com JDBC(Java) você não precisa se preocupar com a modelagem. Este será um problema entre você e o banco que você usa. Apenas mapeie direitinho o banco para que ele fique bem amarrado. Assim, caso no java você faça algum insert, update, delete ou select de maneira errada, será retornada uma exceção.

P

Ola Jonas!
Valeu por respondido, na verdade me coloquei de um modo incompleto o que esta acontecendo tenho uma projeto que tenho que tratar com chaves estrangeiras e não sei como implementar tenho a principio duas tabelas Aluno e Matricula sendo que Matricula tem uma chave estrangeira gostaria de saber como ficaria a classe MatriculaDao em particular o método salvar e tb o main para os testes.
Neste projeto não uso nenhum framework!

P

Ola Thiago!
Valeu por respondido, na verdade me coloquei de um modo incompleto o que esta acontecendo tenho uma projeto que tenho que tratar com chaves estrangeiras e não sei como implementar tenho a principio duas tabelas Aluno e Matricula sendo que Matricula tem uma chave estrangeira gostaria de saber como ficaria a classe MatriculaDao em particular o método salvar e tb o main para os testes.
Neste projeto não uso nenhum framework!

T

@paulopolegario, belezinha?

Isso é moleza! Se liga só…

Você tem duas tabelas, certo? Uma é a Matrícula e a outra é Aluno.

Pela sua modelagem, a tabela Matricula tem um campo reservado para a id da tabela Aluno.

Usando JDBC, eu faria assim:

1 - Cria uma classe modelo chamada Matricula

public class Matricula{
   private String matriculaAluno;
   private String codigoTurma;
   private BigDecimal valor;
   private Calendar data;
   private Aluno aluno;
   
   //gets e sets

}
public class Aluno{
  private int id;
  private String nome;

//gets e sets

Beleza. Agora eu tenho duas classes referenciando exatamente o meu banco de dados. Lembrando que esses dois modelos devem bater com o banco de dados.

Vamos para a ideia do DAO

public class MatriculaDao{
   public void salva(Matricula matricula){
    String sql = "insert into matricula(/*nome dos campos das tabelas*/) values(?,?,?,?,?)";

      prepareStatement = connection.prepareStatement(sql);
		
      //Os sets do preparedStatement
     // O set do Aluno fica assim: prepareStatement.setInt(5, matriculas.aluno.getId());
      //Os outros é  você seguir o que você  fez.

      preparedStatement.executeQuery();

      //Fecha as conexões, trata os erros e etc.

  }
}

Percebi que você também tratou alguns campos como int. Eu os troquei para um tipo mais adequado.

Qualquer dúvida, só mandar que eu respondo.

P

Tiago esta linha esta gerando um erro no aluno

prepareStatement.setInt(5, matriculas.aluno.getMatricula());

repare o dao que fiz:

String sql = “insert into matriculas(Mat_Aluno,Cod_Turma,Valor,Data,o que entraria aqui?)”//esta tabela so tem 4 campo
+ “values(?,?,?,?,?)”;

Connection connection = ConnectionFactory.getConnection();
	PreparedStatement prepareStatement = null;

	try {

		prepareStatement = connection.prepareStatement(sql);
		
		
		prepareStatement.setInt(1, matriculas.getMat_Aluno());
		prepareStatement.setInt(2, matriculas.getCod_Turma());
		prepareStatement.setInt(3, matriculas.getValor());
		prepareStatement.setTimestamp(4, new Timestamp(matriculas.getData().getTime()));
		prepareStatement.setInt(5, matriculas.aluno.getMatricula());
		
		prepareStatement.executeUpdate();
T

Você instanciou o Aluno e inseriu ele dentro do atributo Aluno da classe Matricula?

Não esquece de mandar o log do erro sempre que tiver algum problema. Isso ajuda bastante a solucionar.

P

Estou aqui quebrando a cabeça implementei agora o dao ficou assim

public class MatriculasDao {
public void salvar(Matriculas matriculas) {

	String sql = "insert into matriculas(Mat_Aluno,Cod_Turma,Valor,Data,)"
			+ "values(?,?,?,?)";

	Connection connection = ConnectionFactory.getConnection();
	PreparedStatement prepareStatement = null;

	try {

		prepareStatement = connection.prepareStatement(sql);
		
		prepareStatement.setInt(1, matriculas.getAluno().getMatricula());
		prepareStatement.setInt(2, matriculas.getTurma().getCodigo_turma());
		prepareStatement.setInt(3, matriculas.getValor());
		prepareStatement.setTimestamp(4, new Timestamp(matriculas.getData().getTime()));
		
		
		prepareStatement.executeUpdate();

	} catch (SQLException e) {
		throw new RuntimeException(e);

	} finally {

		try {

			if (prepareStatement != null && !prepareStatement.isClosed()) {
				prepareStatement.close();
			}

			if (connection != null && !connection.isClosed()) {
				connection.close();
			}

		} catch (SQLException e) {

			throw new RuntimeException(e);

		}

	}

}

}

so que agora esta dando esse erro

Exception in thread main java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near )values(11055,23,0,2016-06-17 17:59:40) at line 1

at br.com.polegario.sabetudo.Daos.MatriculasDao.salvar(MatriculasDao.java:35)

at br.com.polegario.sabetudo.Teste.Teste.main(Teste.java:64)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near )values(11055,23,0,2016-06-17 17:59:40) at line 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
T
Solucao aceita

Olha seu SQL como está:

“insert into matriculas(Mat_Aluno,Cod_Turma,Valor,Data,)” + “values(?,?,?,?)”;

Tem uma vírgula no final da especificação dos campos.

P

Não acredito agora foi depois de 2 dias nesta coisas.:grinning:
Tiago muito obrigado!

T

@paulopolegario, de nada. Não esquece de marcar a resposta que te ajudou como “solução”.

Criado 16 de junho de 2016
Ultima resposta 17 de jun. de 2016
Respostas 12
Participantes 3