title: Hibernate : session.get(...) vs session.getNamedQuery(...)
body: <p>In the a transaction process I create/save an object and next to end of transaction I read again object (before setting an history event)</p>
  
  <pre><code>@org.springframework.stereotype.Service
  @Transactional(value="transactionManager")
  public class UTServiceImpl implements UTService {
      private static final Logger logger = Logger.getLogger(UTServiceImpl.class);
      ...
  
      @Autowired
      private DeclarationDao declarationDao;
  ...
  
  public Integer ajouterPersonneImpliquee(ContexteService contexte, Integer pkQualification, Integer pkUT, Acteur personneImpliquee) throws ExceptionValidation {
  ...
  
              pk = declarationDao.creerActeur(pkDeclaration, personneImpliquee);
  
  ....        
  
          // History
          personneImpliquee = declarationDao.rechercherActeurAvecAssurance(personneImpliquee.getPk());
          creerActeGestionActeur(creationActeur, personneImpliquee, contexte.getIdentifiantUtilisateur(), declaration, ut);
  
          return pk;
      }
  }
  </code></pre>
  
  <p>The DAO</p>
  
  <pre><code>@Repository
  public class DeclarationDaoImpl implements DeclarationDao { 
      private Logger logger;  
  
      @Autowired @Qualifier("sessionFactorySinistre")
      private SessionFactory sf;
  
      public DeclarationDaoImpl() {
  
      }
  ....
  
   public Integer creerActeur(Integer pkDeclaration, Acteur acteur) {
          final Session session = sf.getCurrentSession();
  
          // On retrouve la déclaration
          Declaration declaration = (Declaration) session.get(Declaration.class, pkDeclaration);
          if (declaration == null) {
              throw new ExceptionPkEntiteInconnu(Declaration.class, pkDeclaration);
          }
  
          // On ne persiste pas la personne quand c'est un sociétaire, appel NOA systématique
          if (Acteur.TYPE_SOCIETAIRE.equals(acteur.getTypePersonne())) {
              acteur.setPersonne(null);
          }
  
          declaration.getActeurs().add(acteur);
          session.save(acteur);
          return acteur.getPk();
      }
  ...
      public Acteur rechercherActeurAvecAssurance(Integer pkActeur) {
          final Session session = sf.getCurrentSession();
  
          Query query = session.getNamedQuery("Declaration_Acteur_Avec_Assurance");
          query.setInteger(0, pkActeur.intValue());
          Acteur acteur = (Acteur) query.uniqueResult();
  
          // On met la personne en cas de sociétaire
          if (Acteur.TYPE_SOCIETAIRE.equals(acteur.getTypePersonne())) {
              // Il faut ABSOLUMENT détacher l'objet de la session pour ne pas persister la personne rajoutee au flush !!!
              session.evict(acteur);
          }
          return acteur;
      }
  ...
  }
  </code></pre>
  
  <p>When I use <code>session.getNamedQuery(...)</code>. I got always null value for the object acteur.
  The method <code>creerActeur(Integer pkDeclaration, Acteur acteur)</code> called before save an actor in session but don't persist it into database.
  In fact, the actor is persisted only at the end of the transaction.</p>
  
  <p>The problem is solved when we got the object from the session <code>session.get(Acteur.class, pkActeur)</code>.
  I got the object acteur like I want.</p>
  
  <p>My questions are: 
  Why I can't see the object actor (in DB) when I execute the Query "Declaration_Acteur_Complet"? Are there more than one transaction concerned?
  What is the difference between <code>session.get(...)</code> and <code>session.getNamedQuery(...)</code>?</p>
  
  <p>Thanks for you help.</p>