package jpa;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityTransaction;

/**
 * Teste des comportements avec ou sans transaction.
 */
public class Test7 {

  public static void main(String[] args) {
    EntityManagerFactory emf = 
      Persistence.createEntityManagerFactory("Employes");
    EntityManager em = emf.createEntityManager();

    // Crée un nouveau département et le rend persistant, sans transaction
    Departement dept1 = new Departement("Direction", "Nice");
    System.out.println("***" + em.contains(dept1));
    // On remarque que TopLink démarre automatiquement une transaction
    // mais aucune modification n'est effectuée dans la base
    // pendant cette transaction ; seule une séquence est incrémentée.
    em.persist(dept1);
    dept1.setLieu("Tourcoing");
    System.out.println("***" + em.contains(dept1));

    // Ouvre une transaction. Est-ce que le contexte de persistance
    // va enregistrer les modifs précédentes ?
    // Réponse : oui.
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    tx.commit();

    // Que se passe-t-il si on fait un flush explicite 
    // mais pas à l'intérieur d'une transaction ?
    // Réponse : impossible de faire un flush en dehors d'une transaction ;
    // une exception TransactionRequiredException est levée.
    dept1.setLieu("Roubaix");
    em.flush();

//     em.refresh(dept1); // provoque une exception
    System.out.println("***" + dept1.getLieu());
    em.close();
    emf.close();
  }

}
