Merge using Hibernate without deleting other Java data

0

In my Java application Hibernate for bank interaction I use a controller class created even by NetBeans, but the problem I have is the following when doing an edit in some field and only pass this value in the method that I'm going to call and merge all the others that I did not pass are set to null by feeding only the field I passed information.

Below is the method of the controller class that performs the data update.

ProductoDAO.java

 public void edit(Produto produto) throws NonexistentEntityException, Exception {
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        produto = em.merge(produto);
        em.getTransaction().commit();
    } catch (Exception ex) {
        String msg = ex.getLocalizedMessage();
        if (msg == null || msg.length() == 0) {
            Integer id = produto.getCodproduto();
            if (findProduto(id) == null) {
                throw new NonexistentEntityException("The produto with id " + id + " no longer exists.");
            }
        }
        throw ex;
    } finally {
        if (em != null) {
            em.close();
        }
    }
}
    
asked by anonymous 22.05.2015 / 14:07

2 answers

2

EntityManager refresh method updates the database instance, overriding the specified properties and maintaining the others.

The entity that must be passed must be in the managed state.

Unfortunately the refresh method does not work on container managers like Spring and EJB.

In short, the refresh method works as merge for the specified properties.

For example:

Produto p = em.find(Produto.class, 1);  
em.refresh(p);

// Depois do commit o objeto sera salvo no banco de dados
p.setNome("TV Full HD");

In your case it will look something like this:

public void edit(Produto p) {
    EntityManager em = null;

    try {
        em = getEntityManager();
        em.getTransaction().begin();

        Produto produto = em.find(Produto.class, p.getId());
        em.refresh(produto);

        if(p.getNome() != null) {
            produto.setNome(p.getNome());
        }

        // Outras propriedades que você queira sobrescrever

        em.getTransaction().commit();
    }catch (Exception ex) {
        String msg = ex.getLocalizedMessage();
        if (msg == null || msg.length() == 0) {
            Integer id = produto.getCodproduto();
            if (findProduto(id) == null) {
                throw new NonexistentEntityException("The produto with id " + id + " no longer exists.");
            }
        }
        throw ex;
    } finally {
        if (em != null) {
            em.close();
        }
    }
}
    
02.06.2015 / 08:55
0

If in case you have not yet solved, check your persistence.xml settings.

See if it contains this property: name="hibernate.hbm2ddl.auto" value="update"

If you prefer, use a tool that I developed that makes hibernate work much easier.

link: link

Until.

    
07.06.2015 / 21:03