Hibernate Lista Duplicate entry

1 resposta Resolvido
javafxjavamysqlhibernate
J

Fala galera. Bom estou precisando da ajuda de vocês, Eu tenho vários CURSOS cadastrado no banco de dados. ao fazer uma matricula de um ALUNO eu pego o Cursos que ele selecionou e coloca em uma List dentro desse aluno e salvo no banco de dados. A treta é o seguinte quando eu faço uma instanciar de aluno, e coloco o curso dentro da List deste aluno, na primeira vez vai, mas ao instanciar outro aluno e colocar o mesmo curso que já foi adicionado ao outro aluno, dar o seguinte error:

ERROR: Duplicate entry ‘1’ for key 'UK_79s4gn9ouad4ayxcj5bo8x0bh’

Então pelo o que eu vejo eu não posso colocar na List do outro aluno um curso q já esteja na List de outro aluno, isso não entendi galera. o modelo de relacionamento é este:

Minha classe Aluno e Curso:

@Entity
@Table(name = "alunos")
public class Aluno implements Serializable {

    private final IntegerProperty id;
    private final StringProperty nome;
    private final StringProperty cpf;
    private final StringProperty rg;
    private final StringProperty telefone;
    private final StringProperty celular;
    private final StringProperty endereco;
    private final StringProperty bairro;
    private final StringProperty cidade;
    private final StringProperty uf;
    private LocalDate dataNascimento;
    private LocalDate dataMatricula;
    private Funcionario funcionarioMatricula;
    private List<Curso> cursos;

    public Aluno() {
        this.id = new SimpleIntegerProperty();
        this.nome = new SimpleStringProperty();
        this.cpf = new SimpleStringProperty();
        this.rg = new SimpleStringProperty();
        this.telefone = new SimpleStringProperty();
        this.celular = new SimpleStringProperty();
        this.endereco = new SimpleStringProperty();
        this.bairro = new SimpleStringProperty();
        this.cidade = new SimpleStringProperty();
        this.uf = new SimpleStringProperty();
        this.cursos = new ArrayList<>();

    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "aluno_id")
    public Integer getId() {
        return id.get();
    }

    @Column(name = "nome", length = 40)
    public String getNome() {
        return nome.get();
    }

    @Column(name = "cpf", length = 20, unique = true)
    public String getCpf() {
        return cpf.get();
    }

    @Column(name = "rg", length = 15, unique = true)
    public String getRG() {
        return this.rg.get();
    }

    @Column(name = "telefone", length = 16)
    public String getTelefone() {
        return telefone.get();
    }

    @Column(name = "celular", length = 16)
    public String getCelular() {
        return celular.get();
    }

    @Column(name = "endereco", columnDefinition = "text")
    public String getEndereco() {
        return endereco.get();
    }

    @Column(name = "bairro", length = 50)
    public String getBairro() {
        return this.bairro.get();
    }

    @Column(name = "cidade", length = 50)
    public String getCidade() {
        return this.cidade.get();
    }

    @Column(name = "uf", length = 4)
    public String getUf() {
        return this.uf.get();
    }

    @Column(name = "data_nascimento")
    public LocalDate getDataNascimento() {
        return this.dataNascimento;
    }

    @Column(name = "data_matricula")
    public LocalDate getDataMatricula() {
        return this.dataMatricula;
    }

    @ManyToOne
    @JoinColumn(name = "funcionario_id")
    public Funcionario getFuncionarioMatricula() {
        return funcionarioMatricula;
    }

    @OneToMany()
    @JoinTable(name = "aluno_cursos", joinColumns = @JoinColumn(name = "aluno_id"), inverseJoinColumns = @JoinColumn(name = "curso_id"))
    public List<Curso> getCursos() {
        return this.cursos;
    }
  //demais sets ocultados
}

Classe Curso:

@Entity
@Table(name = "cursos")
public class Curso implements Serializable {
    
    private final IntegerProperty id;
    private final StringProperty nome;
    private final IntegerProperty cargaHoraria;
    private final StringProperty conteudo;
    private final DoubleProperty valor;
    private final IntegerProperty porcentagemDesconto;
    
    
    public Curso() {
        this.id = new SimpleIntegerProperty();
        this.nome = new SimpleStringProperty();
        this.cargaHoraria = new SimpleIntegerProperty();
        this.conteudo = new SimpleStringProperty();
        this.valor = new SimpleDoubleProperty();
        this.porcentagemDesconto = new SimpleIntegerProperty();
    }
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "curso_id")
    public Integer getId() {
        return id.get();
    }
    
    @Column(name = "nome", length = 40, nullable = false)
    public String getNome() {
        return nome.get();
    }
    
    @Column(name = "carga_horaria")
    public Integer getCargaHoraria() {
        return cargaHoraria.get();
    }   
        
    @Column(name = "conteudo", columnDefinition = "text")
    public String getConteudo() {
        return this.conteudo.get();
    }
    @Column(name = "valor", columnDefinition = "DECIMAL(10,2)")
    public double getValor(){
        return this.valor.get();
    }
    @Column(name = "porcentagem_desconto",columnDefinition = "INT DEFAULT '0'")
    public int getPorcentagemDesconto(){
        return this.porcentagemDesconto.get();
    }
  //demais sets ocultados.
}

e a maneira que estou salvando um aluno no banco é assim:

Aluno aluno = new Aluno();
aluno.setNome(txtNome.getText().trim());
//tabela que já contém os cursos. foi populada com os cursos no banco de dados
aluno.setCursos(tbCursoSelecionado.getItems());
//salva o aluno.
BancoDeDados.save(aluno);

alguém poderia me dar uma Luz? pois só salva o primeiro aluno, mas se salvar outro aluno q tenha o curso tbm, já dar aquele erro.

1 Resposta

J
Solucao aceita

Galera acabei resolvendo está treta, o problema era o tipo de relacionamento q eu havia determinado pois eu havia colocado @OneToMany sendo que o tipo de relacionamento era @ManyToMany e agora tá cadastrando corretamente.

Criado 4 de julho de 2017
Ultima resposta 4 de jul. de 2017
Respostas 1
Participantes 1