public Aluno save(Aluno a) {
EntityManager em = new ConnectionFactory().getConnection();
try {
em.getTransaction().begin();
//teste para saber se vai salvar ou atualizar
if (a.getMatricola() == null) {
//caso id nulo ira gravar novo registro
em.persist(a);
JOptionPane.showMessageDialog(null, "Aluno :" + a.getNome() + " Cadastrado !");
} else {
//caso não nulo atualiza o dado existente
em.merge(a);
}
em.getTransaction().commit();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
em.getTransaction().rollback();
} finally {
em.close();
}
return a;
}
eu antes vejo se o id ja existe, se já existir é para atualizar porem neste cadastro de alunos existe o campo “foto”, e quando eu atualizo apenas o nome do aluno por ex, o hibernate excclui a foto do banco de dados, se alguem puder me ajudar, queria que o hibernate atualizasse apenas campos alterados
O hibernate cria o update com todas os campos da tua entidade. Se, na altura do merge, foto está a null, vai fazer o set do valor a null. O que te pode ajudar é DynamicUpdate
Como é que você está chamando esse método save?
Vi que ele recebe e retorna um objeto do tipo Aluno, certo?
Pois bem, o persist serve para fazer insert de um objeto e deixar ele “gerenciado” pelo EntityManager.
O merge serve para fazer insert de um objeto, caso o ID seja null ou então para fazer o update daquele objeto caso o ID esteja inicializado, mas o merge não torna o objeto recebido “gerenciado” pelo EntityManager, ao invés disso ele retorna um objeto “gerenciado”, então provavelmente você tem que modificar o seu save dessa forma:
public Aluno save(Aluno a) {
EntityManager em = new ConnectionFactory().getConnection();
try {
em.getTransaction().begin();
//teste para saber se vai salvar ou atualizar
if (a.getMatricola() == null) {
//caso id nulo ira gravar novo registro
em.persist(a);
JOptionPane.showMessageDialog(null, "Aluno :" + a.getNome() + " Cadastrado !");
} else {
// caso não nulo atualiza o dado existente
// e atualiza a referência de 'a' para o objeto gerenciado pelo 'em'
a = em.merge(a);
}
em.getTransaction().commit();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
em.getTransaction().rollback();
} finally {
em.close();
}
return a;
}
E no lugar onde chama você também tem que atualizar a referência, exemplo:
Aluno aluno = /* sei lá como você inicializou */;
aluno = save(aluno); // atualizar a referência ao salvar