2011-03-21 13 views
9

¿Cómo se configuran las asignaciones de clase Hibernate de la clase org.springframework.orm.hibernate3.LocalSessionFactoryBean en el Springapplication context? Quiero mover las asignaciones de clase session factory de la siguiente hibernate.cfg.xml al bean de fábrica de la sesión Spring correspondiente para que pueda eliminar hibernate.cfg.xml.¿Cómo se traducen las asignaciones de clase Hibernate a un contexto de aplicación Spring?

Archivo hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- ... --> 
     <mapping resource="Queries.hbm.xml" /> 
     <mapping class="com.company.app.common.model.Account" /> 
     <mapping class="com.company.app.common.model.AccountCategory" /> 
     <mapping class="com.company.app.common.model.AssetType" /> 
     <mapping class="com.company.app.common.model.Book" /> 
     <mapping class="com.company.app.model.AssetTypeCategory" /> 
     <!-- ... --> 
    </session-factory> 
</hibernate-configuration> 

Archivo spring-application-context.xml:

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 

    <!-- Instead of the above, I want to use the following. Where and 
    how do I define the class mappings so that I may eliminate 
    hibernate.cfg.xml? --> 
    <-- 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingResources"> 
     <list> 
      <value>Queries.hbm.xml</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
    --> 
</bean> 
+0

quiero eliminar el archivo 'hibernate.cfg.xml' moviendo su contenido en el contexto de aplicación de primavera. –

+0

¿Están estas clases de entidad anotadas? – skaffman

+0

Sí, estas son clases anotadas. –

Respuesta

23

Si utiliza clases anotadas-APP, se puede utilizar en lugar de AnnotationSessionFactoryBeanLocalSessionFactoryBean, e inyectar las clases directamente en la primavera bean:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.company.app.common.model.Account</value> 
      <value>com.company.app.common.model.AccountCategory</value> 
      <value>com.company.app.common.model.AssetType</value> 
      <value>com.company.app.common.model.Book</value> 
      <value>com.company.app.model.AssetTypeCategory</value>  
     </list> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>Queries.hbm.xml</value> 
     </list> 
    </property>   
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
</bean> 
+0

¿Dónde coloco 'Queries.hbm.xml' que contiene algunas consultas HQL? –

+0

@Derek: 'AnnotationSessionFactoryBean' extiende' LocalSessionFactoryBean', por lo que aún puede usar todas las mismas propiedades que antes, incluyendo 'mappingResources'. – skaffman

+0

¡Excelente! ¡Buena respuesta! –

9

Como una ligera variación en skaffman de answer, he utilizado la propiedad de la clase packagesToScanAnnotationSessionFactoryBean para evitar la lista de todos los nombres de las clases individuales modelo:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.company.app.common.model</value> 
     </list> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>Queries.hbm.xml</value> 
     </list> 
    </property>   
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
</bean> 

he aprendido acerca de esta propiedad del excelente libro Spring in Action, Third Edition.

0

también estaba enfrentando el mismo problema, y ​​esto funcionó para mí -

<bean id="auditCoreSessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="auditCoreDataSource" /> 
    </property> 
    <property name="packagesToScan" value="com.odeon.audit.dao.entity" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.odeon.audit.dao.entity.AuditLogEntity</value> 
      <value>com.odeon.audit.dao.entity.AuditLogApplicationEtity</value> 
      <value>com.odeon.audit.dao.entity.AuditLogModuleEntity</value> 
      <value>com.odeon.audit.dao.entity.AuditLogOperationEntity</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">#{auditCoreProp.getString('jdbc.dialect')}</prop> 
      <prop key="hibernate.show_sql">#{auditCoreProp.getString('jdbc.show_sql')}</prop> 
      <prop key="hbm2ddl.auto">#{auditCoreProp.getString('jdbc.hbm2ddl.auto')} 
      </prop> 
      <!-- prop key="hibernate.hbm2ddl.auto">create</prop --> 
     </props> 
    </property> 
</bean> 
Cuestiones relacionadas