2010-12-10 19 views
5

Tengo la anotación @Transactional en todos mis DAO, pero solo puedo definir un TransactionManager que tome solo una SessionFactory. Tengo una SessionFactory por cliente, una DataSource por cliente y aparentemente necesito cambiar TransactionManager para cada cliente. Pero, ¿cómo puedo obtener el administrador de transacciones correcto para el cliente, cuando solo puedo definir un nombre de Spring Bean para un TransactionManager?Multiple SessionFactories, Multiple DataSources e Hibernate TransactionManager solo pueden tomar un Sessionfactory

Respuesta

2

Este es un ejemplo de cómo la gestión de transacciones declarativa de Spring ya no es conveniente, y necesita cambiar a programmatic management para obtener la flexibilidad que necesita. Esto le permitirá inyectar, por ejemplo, un mapa de administradores de transacciones en su capa DAO, y seleccionar el correcto según corresponda, usando TransactionTemplate para facilitar las cosas.

Alternativamente, si está ejecutando dentro de un contenedor que admite JTA, entonces puede usar Spring's JtaTransactionManager. Esto delega la gestión de transacciones en el servidor de la aplicación, al tiempo que conserva la semántica de Spring API. También significa que un número arbitrario de DataSources y SessionFactories puede participar bajo un gerente de transacción. Sin embargo, esto significa que sus DataSources necesitan ser totalmente administrados por el servidor de aplicaciones, lo que probablemente no le funcione.

+0

Quiero decir que tengo que ajustar cada método con transactionTemplate.execute (new TransactionCallback() {}); ¿código? – newbie

+0

@newbie: Esencialmente, sí – skaffman

1

Puede crear un PlatformTransactionManager que delegue llamadas a un administrador de transacciones específico del cliente para el cliente actual. El cliente actual se puede almacenar, por ejemplo, como una variable ThreadLocal.