MERGE altera campos que nao era para alterar

Boa tarde pessoal,

estou com um problema :

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

coloquei na minha classe
package marvin.escola.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicUpdate;

@Entity
@DynamicUpdate
public class Responsavel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String mat_aluno;
private String nome;
private String grau_pare;
private String cell;
private String loc_trab;
private String obs;
private byte[] foto;

public Integer getId() {
    return id;
}

porem ainda assim no update ele setou NULL no campo FOTO

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