domenica 4 marzo 2012

EntityManager merge vs flush

La differenza fondamentale tra l'usare il metodo merge e il persist dell' EntityManager è che il metodo persist lascia l'entità in uno stato "managed" anche dopo la sua invocazione, mentre il metodo merge no.
Si può verificare il comportamento con un semplice esempio, supponiamo che il nostro Ejb abbia i 2 seguenti metodi:

.......
public void inserisci(Persona p) {
        System.out.println("Inserisco la persona");
        em.persist(p);
        p.setEta(99);

    }

public void inserisciM(Persona p) {
        System.out.println("Inserisco la persona");
        em.merge(p);
        p.setEta(99);
    }
.....


Il codice client che richiama i metodi è il seguente:

public static void main(String[] args) throws Exception {
        Properties p=new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
        p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
        Context ctx=new InitialContext(p);
        GestoreDao gd=(GestoreDao)ctx.lookup("Anagrafe/remote");
        System.out.println("Ok alla lookup");
        Persona p1=new Persona();
        p1.setCognome("Rossi");
        p1.setNome("marco");
        p1.setEta(32);
        gd.inserisci(p1);
        Persona p2=new Persona();
        p2.setCognome("Verdi");
        p2.setNome("Gino");
        p2.setEta(32);
        gd.inserisciM(p2);
    }


Nel primo caso, chiamando il metodo persist, il valore dell'età della persona Marco Rossi sarà settata a 99, nel secondo caso, chiamando il metodo merge invece resterà al valore base di 32.

Nessun commento:

Posta un commento