web-dev-qa-db-fra.com

applicationContext.xml avec source de données ou hibernate.cfg.xml. Différence?

Vous voulez effacer une certaine confusion. J'ai applicationContext.xml.

Question 1: Quelle est la différence entre 1 et 2. Sont-ils tous les deux identiques avec une approche différente?

Question 2:

J'ai posé une question sur le forum Spring concernant un problème. Ce qu'il a mentionné à propos de la mise en commun est ci-dessous

si vous avez besoin/souhaitez utiliser le pool de connexion interne pour la mise en veille prolongée, je vous déconseille et je configure simplement une source de données qui prend en charge le pool de connexion et l'injectez dans votre sessionfactorybean.

mise en commun des connexions internes pour la mise en veille prolongée = Il s'agit de numéro 2 ci-dessous. Droite?

configurez simplement une source de données qui prend en charge le regroupement de connexions et injectez-la dans votre sessionfactorybean = Ceci est numéro 1 ci-dessous. droite?

1 # -

<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="100"/>
        <property name="maxIdle" value="30"/>
        <property name="maxWait" value="16000"/>
        <property name="minIdle" value="0"/>
    </bean>

 <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="annotatedClasses">
            <list>
                <value>com.mkyong.customer.model.Customer</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.generate_statistics">true</prop>
            </props>
        </property>
    </bean>

2 # -

Les informations de mise en commun et de connexion se trouvent dans hibernate.cfg.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
    </bean>
23
Pirzada

Réponse 1:

Les deux approches sont les mêmes. Par défaut, hibernate lit la configuration à partir de classpath:hibernate.cfg.xml pour construire SessionFactory. LocalSessionFactoryBean vous permet simplement de configurer la configuration d'hibernation dans applicationContext.xml au lieu de hibernate.cfg.xml.

Si une même propriété est spécifiée dans les deux fichiers, selon la propriété, elle aura un effet addictif ou les propriétés spécifiées dans applicationContext.xml aura une priorité plus élevée de sorte que ces valeurs dans hibernate.cfg.xml sera ignoré.

Pour la méthode 1, annotatedClasses et hibernateProperties devraient avoir l'effet addictif avec les valeurs correspondantes dans hibernate.cfg.xml. La source de données DBCP dans applicationContext.xml devrait provoquer les propriétés associées dans hibernate.cfg.xml être ignoré.

Réponse 2:

Pour la méthode 2, si vous ne spécifiez aucune propriété de LocalSessionFactoryBean, toutes les configurations d'hibernation sont spécifiées par le hibernate.cfg.xml. Si aucun pool de connexions n'est configuré dans hibernate.cfg.xml, l'algorithme de mise en commun des connexions d'Hibernate est utilisé par défaut , ce qui est assez rudimentaire et n'est pas destiné à être utilisé dans un système de production, ni même à des tests de performances.

10
Ken Chan

Si vous voulez construire une fabrique de sessions, vous obtiendrez le même résultat avec les deux approches. Je ne pense pas que l'un puisse faire plus que l'autre.

À mon avis, vous utiliseriez l'approche hibernate.cfg.xml lorsque vous n'utilisez pas Spring. Lorsque JUnit teste vos DAO par exemple. Ne pas avoir à créer un contexte d'application Spring accélère l'exécution de vos tests.

Cependant, lorsque vous utilisez Spring, je pense que c'est une bonne chose de garder votre source de données séparée de la fabrique de sessions. Vous utilisez Spring pour l'injection de dépendance, non? Pourquoi ne pas utiliser le printemps pour donner à votre usine de session ce dont elle a besoin?

4
Alban