¿Cómo puedo definir varias instancias de sesión de fábrica en Spring?

Me gustaría tener múltiples Hibernate SessionFactories en una aplicación de primavera, todas ellas con configuraciones idénticas, excepto DataSource. Idealmente, adquiriría una SessionFactory particular por su nombre. Necesito poder hacer esto en función del estado de tiempo de ejecución, y no es posible determinar qué fábricas de sesiones necesitaré en el momento del inicio de la aplicación. Básicamente, necesito una SessionFactoryTemplate o algo así.

es posible? ¿Cómo hago para hacerlo?

Respuesta 1

Puede definir un bean abstracto y usar herencia de bean. Esto significa que tendrá una definición de bean que funciona como una plantilla y puede tener múltiples beans simplemente copiando los atributos establecidos por el bean principal.

Aquí hay un ejemplo:

<bean id="abstractSessionFactory" abstract="true"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
</bean>

<bean id="mySessionFactory" parent="abstractSessionFactory">
    <property name="dataSource" ref="myDataSource"/>
    ...
</bean>

<bean id="mySessionFactory2" parent="abstractSessionFactory">
    <property name="dataSource" ref="myDataSource2"/>
    ...
</bean>

Usando el atributo 'abstract', se asegura de que el bean no se instanciará y se usará solo como plantilla.

Más información aquí: texto del enlace

Respuesta: 2

¿Estás seguro de que necesitas múltiples SessionFactories? Si todas las asignaciones / configuraciones son iguales y solo tiene varias bases de datos idénticas (por ejemplo, en una aplicación multiinquilino?), ¿Qué tal si tiene una única SessionFactory que se conecta a un DataSource que proporciona dinámicamente la conexión de base de datos adecuada?

Vea esta pregunta para más detalles:

Y esta publicación de blog sobre Enrutamiento dinámico de fuentes de datos en primavera.

Respuesta: 3

No tengo idea de cómo se ve su definición actual de bean ahora, pero ¿no simplemente ... definiría una segunda SessionFactory?

<bean id="mySessionFactory1" 
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource1"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
</bean>

<bean id="mySessionFactory2"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource2"/>
    ...
</bean>

Luego, podría simplemente conectar sus DAO con una sesión FactoryFactory frente a la otra:

<bean id="myProductDao" class="product.ProductDaoImpl">
  <property name="sessionFactory" ref="mySessionFactory1"/>
</bean>

<bean id="myCompanyDao" class="product.ProductDaoImpl">
  <property name="sessionFactory" ref="mySessionFactory2"/>
</bean>
Respuesta: 4

¿Alguien sabe acerca de la biblioteca de autorización independiente de la base de datos Java / C #? Esta biblioteca debe admitir acciones de lectura, escritura, eliminación e inserción en toda la estructura organizativa de la empresa. Algo como ...

Estoy pasando una interfaz como implementación anónima a un objeto diferente como este: public interface Interface {public int convert (int a); } public static void main (String [] args) lanza ...

Estoy probando la API de Amazon Device Messaging. Agregué el archivo jar usando la importación según lo sugerido por Amazon. Cuando despliegue en el dispositivo, aparece un error, 06-03 16: 24: 13.680: E / AndroidRuntime (11038): ...

Estoy tratando de crear un selector de archivo 'Guardar en'. Sin embargo, cuando ejecuto el código y presiono 'Abrir', se abre una nueva ventana de selección de archivos. El código: int val = jFileChooser1.showOpenDialog (nulo); privado ...