Merge en refresh

Merge

We kunnen de aanpassing van een unmanaged object wel nog doorsturen naar de databank met de merge methode van de EntityManager, Let wel dit maakt het object weer managed:

public class ChangeMessageApp4 {
   public static void main(String[] args) {
      EntityManagerFactory emf = null;
      EntityManager em = null;
      try {
         emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
         em = emf.createEntityManager();

         em.getTransaction().begin();
         Message msg = em.find(Message.class, 1L);
         em.getTransaction().commit();

         em.detach(msg);
         msg.setText("Hello Saturnus"); // unmanaged

         em.getTransaction().begin();
         em.merge(msg);
         em.getTransaction().commit();
      } finally {
         if (em != null)
            em.close();
         if (emf != null)
            emf.close();
      }
   }
}

De databank ziet er na deze verwerking als volgt uit:

idtext
1Hello Saturnus

Refresh

De methode refresh() van de klasse EntityManager dient om managed objecten te verversen, terug te brengen naar de oorspronkelijke inhoud zoals in de databank. Indien het object unmanaged is zal dit een IllegalArgumentException opgooien.

De volgende code zal onze databank niet wijzigen. Maar wel afprinten wat er in de databank staat:

public class RefreshMessageApp {
   public static void main(String[] args) {
      EntityManagerFactory emf = null;
      EntityManager em = null;
      try {
         emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
         em = emf.createEntityManager();

         em.getTransaction().begin();
         Message msg = em.find(Message.class, 1L);
         em.getTransaction().commit();

//         em.detach(msg);
         msg.setText("Hello Uranus");
         em.refresh(msg);
         System.out.println(msg);
      } finally {
         if (em != null)
            em.close();
         if (emf != null)
            emf.close();
      }
   }
}

Opdracht:

Haal in bovenstaande code em.detach(msg); uit commentaar (lijn 13) en voer ze uit.