2016-07-23 3 views
0

J'ai obtenu plusieurs classes DAO qui s'étendent à un BaseDAO, et j'ouvre une nouvelle session dans le BaseDAO de sorte que tous les DAO utilisent la même session.Hibernate session usine une nouvelle session pour plusieurs DAO

@Autowired 
public BaseDAOImpl(SessionFactory sessionFactory) { 
    super(sessionFactory); 
    this.mySession = sessionFactory.openSession(); 
    logger.info("My Session is Open."); 
} 

public Session getMySession(){ 
    return this.mySession; 
} 

@Repository("countryDAO") 
public class CountryDAOImpl extends BaseDAOImpl<Country> implements CountryDAO{ 

    @Autowired 
    public CountryDAOImpl(SessionFactory sessionFactory) { 
     super(sessionFactory); 
    } 
} 

@Repository("regionDAO") 
public class RegionDAOImpl extends BaseDAOImpl<Region> implements RegionDAO{ 

    @Autowired 
    public RegionDAOImpl(SessionFactory sessionFactory) { 
     super(sessionFactory); 
    } 
} 

Dans ma classe de service I auto-câblage 2 DAO.

@Autowired 
CountryDAO countryDAO; 

@Autowired 
RegionDAO regionDAO; 

Dans ma console, j'ai vu que Ma session est ouverte deux fois. Cela signifie-t-il qu'il ouvre 2 nouvelles sessions? Je ne veux pas utiliser la session en cours pour une raison quelconque, donc j'utilise openSession(). Quand je fais countryDAO.getMySession(). Clear() il efface seulement l'entité chargée dans la session countryDAO mais pas regionDAO.

Répondre

0

Oui, il fait 2 sessions différentes. Vous pouvez le vérifier en ajoutant le journal

logger.info("My Session is Open:" + this.mySession.toString()); 

Si vous souhaitez utiliser une session pour tous vos DAOS, utilisez .getCurrentSession() au lieu de .openSession(). Pour que cela fonctionne également, vous devez mettre à jour votre configuration hibernate avec

<property name="hibernate.current_session_context_class">thread</property> 
+0

Comment puis-je utiliser seulement 1 session pour tous les DAO? –

+0

Mon programme a une boucle et j'ai besoin de valider chaque boucle, donc je ne veux pas utiliser getCurrentSession() –

+0

Je ne suis pas sûr de votre besoin. Vous devriez ajouter votre boucle et "commettre chaque boucle" à votre question. – Rocherlee